Как установить режим безопасности для транспорта в библиотеке WcfCoreMtomEncoder? - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь отправить документы в веб-службу в. Net Базовом приложении. Но я узнал, что. Net Ядро не поддерживает 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 ссылкой Мне нужно установить режим безопасности для транспорта

ВОПРОС - как мне установить режим безопасности для транспортировки в этой WcfCoreMtomEncoder библиотеке? Я просмотрел некоторые свойства 'HttpTransportBindingElement', но на самом деле не увидел ни одного, чтобы установить.

1 Ответ

0 голосов
/ 22 января 2020

Вы правы, это полезно в базовом проекте.
Что касается подробностей ошибки, это связано с тем, что привязка и адрес службы должны быть согласованы между клиентской стороной и сервером. сторона при звонке в сервис. 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).

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
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...