C# 如何在WcfCoreMtomEncoder库中将安全模式设置为传输?
我正在尝试将文档发送到.Net核心应用程序中的web服务。但我了解到.NETCore不支持“MTOM” WSMessageEncoding.Mtom 所以我找到了这个图书馆,并认为我可以让它工作!??也许不是 这是我在.NETCore之前拥有的C# 如何在WcfCoreMtomEncoder库中将安全模式设置为传输?,c#,wcf,wcf-binding,wcf-security,wcfcoremtomencoder,C#,Wcf,Wcf Binding,Wcf Security,Wcfcoremtomencoder,我正在尝试将文档发送到.Net核心应用程序中的web服务。但我了解到.NETCore不支持“MTOM” WSMessageEncoding.Mtom 所以我找到了这个图书馆,并认为我可以让它工作!??也许不是 这是我在.NETCore之前拥有的 BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport); var binding = new BasicHttpBi
BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport)
{
MessageEncoding = WSMessageEncoding.Mtom,
TransferMode = TransferMode.Streamed
};
EndpointAddress endpoint = new EndpointAddress(url);
ChannelFactory<T> channelFactory = new ChannelFactory<T>(binding, endpoint);
var webService = channelFactory.CreateChannel();
BasicHttpBinding=新的BasicHttpBinding(BasicHttpSecurityMode.Transport);
var binding=新的BasicHttpBinding(BasicHttpSecurityMode.Transport)
{
MessageEncoding=WSMessageEncoding.Mtom,
TransferMode=TransferMode.Streamed
};
EndpointAddress端点=新的端点地址(url);
ChannelFactory ChannelFactory=新的ChannelFactory(绑定,端点);
var webService=channelFactory.CreateChannel();
这是我放进图书馆后得到的东西
var encoding = new MtomMessageEncoderBindingElement(new TextMessageEncodingBindingElement());
var transport = new HttpTransportBindingElement();
transport.TransferMode = TransferMode.Streamed;
var binding = new CustomBinding(encoding, transport);
EndpointAddress endpoint = new EndpointAddress(url);
ChannelFactory<T> channelFactory = new ChannelFactory<T>(binding, endpoint);
var webService = channelFactory.CreateChannel();
var encoding=new MtomMessageEncoderBindingElement(new TextMessageEncodingBindingElement());
var transport=新的HttpTransportBindingElement();
transport.TransferMode=TransferMode.Streamed;
var绑定=新的CustomBinding(编码、传输);
EndpointAddress端点=新的端点地址(url);
ChannelFactory ChannelFactory=新的ChannelFactory(绑定,端点);
var webService=channelFactory.CreateChannel();
但是我在创建频道时遇到了这个异常
提供的URI方案“https”无效;应为“http”
根据这一点,我需要将安全模式设置为transport
问题-如何设置此库中传输的安全模式?
我查看了一些“HttpTransportBindingElement”属性,但没有真正看到要设置的属性 你说得对,它在基于核心的项目中很有用。
关于错误细节,这是因为在调用服务时,客户端和服务器端之间的绑定和服务地址应该一致。客户端中的服务Url必须通过
Https
协议工作,因为绑定使用传输层安全模式。事实上,在托管此类服务(传输安全模式)时,我们应该提供一个Https
绑定地址。在客户端,我们构造一个自定义绑定来使用服务。然后可以通过Https
协议与服务器通信。为了使用
Https
协议,我们可以使用HttpsTransportBindingElement
。请参考以下代码段
var encoding = new MtomMessageEncoderBindingElement(new TextMessageEncodingBindingElement());
var transport = new HttpsTransportBindingElement();
transport.TransferMode = TransferMode.Streamed;
var binding = new CustomBinding(encoding, transport);
EndpointAddress endpoint = new EndpointAddress("https://vabqia969vm:21011");
ChannelFactory<IService> channelFactory = new ChannelFactory<IService>(binding, endpoint);
var webService = channelFactory.CreateChannel();
Console.WriteLine(webService.Test());
结果。相关文档。
如果有什么我能帮忙的,请随时告诉我。你好,亚伯拉罕。我有几个问题。1.当您说“我们应该创建具有相同绑定的WCF服务”时,如果我的客户端是.Net Core,而服务器端(我们的客户)是.Net Framework,我可以这样做吗。我相信这是因为他们的文档使用.Net框架代码来调用他们的服务。2.在您的第二个代码段中,您使用了“MtomMessageEncodingBindingElement”,我相信这是针对.Net Framework的,对吗?如果我是.Net Core,我不应该使用我找到的第三方库中的“MtomMessageEncoderBindingElement”吗?3.与问题2相同,但对于“ServiceHost”?首先,服务器端必须基于Dotnet framework,因为WCF framework尚未在Dotnet core中实现。我们无法在Dotnet核心项目中创建WCF服务。基于核心的客户端只是一个兼容的解决方案。许多功能尚未实现。1.以上客户端代码基于Dotnet Core,服务器端WCF以Dotnet framework为目标。如果我们在基于Dotnetframework的项目中调用该服务,则本机支持该服务。Dotnet框架已经支持MTOM编码。2.是的,因为支持MTOM编码是dotnet framework中的内置功能。这些代码片段是WCF服务器,不可能在Dotnet Core中实现。“相同绑定”是指自定义绑定而不是基本绑定。3.WCF服务尚未在AspDotCore中实现,“ServiceHost”也未实现。@user1186050,在上面的代码片段中,我们还可以创建一个没有传输层安全模式的服务。它也可以在Dotnet核心应用程序中正确调用。如果我们这样做,我们不需要指定'https'基址,也不需要绑定证书,它将很容易完成。
class Program
{
static void Main(string[] args)
{
Uri uri = new Uri("https://localhost:21011");
MtomMessageEncodingBindingElement encoding = new MtomMessageEncodingBindingElement();
var transport = new HttpsTransportBindingElement();
transport.TransferMode = TransferMode.Streamed;
var binding = new CustomBinding(encoding, transport);
using (ServiceHost sh = new ServiceHost(typeof(MyService), uri))
{
sh.AddServiceEndpoint(typeof(IService), binding, "");
ServiceMetadataBehavior smb;
smb = sh.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb == null)
{
smb = new ServiceMetadataBehavior()
{
HttpsGetEnabled = true
};
sh.Description.Behaviors.Add(smb);
}
Binding mexbinding = MetadataExchangeBindings.CreateMexHttpsBinding();
sh.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");
sh.Opened += delegate
{
Console.WriteLine("Service is ready");
};
sh.Closed += delegate
{
Console.WriteLine("Service is clsoed");
};
sh.Open();
Console.ReadLine();
//pause
sh.Close();
Console.ReadLine();
}
}
}
[ServiceContract]
public interface IService
{
[OperationContract]
string Test();
}
public class MyService : IService
{
public string Test()
{
return DateTime.Now.ToLongTimeString();
}
}