如何设置安全模式以在WcfCoreMtomEncoder库中传输?

问题描述 投票:0回答:1

我正在尝试将文档发送到.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”属性,但没有真正看到要设置的属性。

c# wcf wcf-binding wcf-security wcfcoremtomencoder
1个回答
0
投票

是的,它在基于核心的项目中很有用。关于错误详细信息,这是由于在调用服务时,客户端和服务器端之间的绑定和服务地址应该一致。由于绑定使用传输层安全模式,因此客户端的服务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();
        }
    }

结果。enter image description here相关文档。https://docs.microsoft.com/en-us/dotnet/framework/wcf/extending/custom-bindings请随时告诉我是否有什么我可以帮助的。

© www.soinside.com 2019 - 2024. All rights reserved.