我正在尝试将文档发送到.Net Core应用程序中的Web服务。但是我了解到.Net Core不支持'MTOM'
WSMessageEncoding.Mtom
所以我找到了这个WcfCoreMtomEncoder库,以为我可以使它工作!?也许不是...?
这是.Net Core之前的内容
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();
这是我放入图书馆后的东西
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();
但是创建频道时出现此异常
提供的URI方案'https'无效;预期的“ http”
根据此SO link我需要将安全模式设置为传输
问题-如何设置要在此WcfCoreMtomEncoder库中传输的安全模式?我浏览了一些“ 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());
但是,由于服务器端和客户端之间的绑定不一致,因此无法使用。我们应该创建具有相同绑定的WCF服务。服务器端(由于基于Dotnet Framework4.7.2
的库,所以[Dotnet Standard2.0
)。
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();
}
}
结果。相关文档。https://docs.microsoft.com/en-us/dotnet/framework/wcf/extending/custom-bindings请随时告诉我是否有什么我可以帮助的。