Общие сведения о службе / конечной точке WCF Multipart Soap с вложением (SwA) - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь понять, как создать / разработать конечную точку Multipart WCF Soap, которая принимает вложения в качестве входных параметров, разделенных «MIME-разделителем».

Я получил пример того, кто запрашивает такая конечная точка могла бы выглядеть, но я не понимаю, как создать службу для получения запроса.

Итак, полученный мной пример был примерно таким (к вашему сведению, я удалил информацию из соображений безопасности):

--MIME11111.11111
<SOAP-ENV:Envelope xmlns:SOAP-ENV="" xmlns:eb="" xmlns:xsi="" xsi:schemaLocation="">
  <SOAP-ENV:Header>
    <eb:MessageHeader SOAP-ENV:mustUnderstand="1" eb:version="2.0">
      <eb:From>
        <eb:PartyId eb:type="TYPE1">NUMBER</eb:PartyId>
      </eb:From>
      <eb:To>
        <eb:PartyId eb:type="TYPE2">NUMBER</eb:PartyId>
      </eb:To>
      <eb:CPAId>ID</eb:CPAId>
      <eb:Service eb:type="TYPE3">TEXT</eb:Service>
      <eb:Action>TEXT</eb:Action>
      <eb:MessageData>
        <eb:MessageId>ID</eb:MessageId>
        <eb:Timestamp>DATE</eb:Timestamp>
      </eb:MessageData>
    </eb:MessageHeader>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <eb:Manifest eb:version="2.0">
      <eb:Reference xlink:href="cid:payload-1" xlink:role="aop:ROOT"/>
    </eb:Manifest>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

--MIME11111.11111
Content-ID: payload-1

<?xml version="1.0" encoding="UTF-8"?>
<aop:ROOT xsi:schemaLocation="" xmlns:aop="" xmlns:xsi="">
    <aop:ELEMENT>
        <aop:SUBELEMENT11>TEXT</aop:SUBELEMENT11>
        <aop:SUBELEMENT12>
            <aop:SUBELEMENT21>NUMBER</aop:SUBELEMENT21>
            <aop:SUBELEMENT22>NUMBER</aop:SUBELEMENT22>
        </aop:SUBELEMENT12>
    </aop:ELEMENT>
</aop:ROOT>
--MIME11111.11111--

То, что я сделал до сих пор:

  1. Создал проект WCF в Visual Studio.
  2. Создал свой интерфейс следующим образом:

    [ServiceContract]
    public interface IService1
    {
    
       [OperationContract]
       [WebInvoke(Method = "Post", BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/PostBusinessData")]
       PostBusinessDataResponseContract PostBusinessData(Manifest data);
    
    }
    
    [MessageContract]
    public class Manifest
    {
       [MessageHeader]
       public Headers MessageHeader { get; set; }
    
       [MessageBodyMember]
       public Stream Reference { get; set; }
    }
    
    [MessageContract]
    public class PostBusinessDataResponseContract
    {
       [MessageBodyMember]
       public string PostBusinessDataResponse { get; set; }
    }
    
  3. Создал мой контроллер / службу следующим образом:

    public class Service1 : IService1
    {
        public PostBusinessDataResponseContract PostBusinessData(Manifest data)
        {
            return new PostBusinessDataResponseContract() { PostBusinessDataResponse = "It Works"};
        }
    }
    
  4. Мой класс заголовка был создан путем «специальной вставки» XML структура между элементами «заголовка» из приведенного выше примера.

У меня есть класс Model для заголовка soap -envelope, который в значительной степени настроен, за исключением некоторых атрибутов элементов. появляются как подэлементы в t он сгенерировал структуру запроса.

Но главное, что я не совсем понимаю, как построить код для параметра in в отношении вложения. Мне кажется, что Attachment в примере multipart входит как поток, но как поток чего? Файл, xml строка / текст? единственное, что содержит ссылка в конверте SOAP, - это так называемый «Content-ID». Никакого имени файла, ничего больше.

Как мне настроить мою конечную точку в моей резервной копии, чтобы иметь возможность использовать тип запроса, показанный в примере выше, действительно мой вопрос.

1 Ответ

0 голосов
/ 26 мая 2020

По вашему описанию сделал демку. После создания службы WCF мы можем сгенерировать прокси-класс для вызова службы, добавив ссылку на службу.

enter image description here

Щелкните правой кнопкой мыши «Ссылки» и выберите «Добавить службу». Ссылка.

enter image description here

Введите адрес службы в поле адреса и нажмите OK, чтобы сгенерировать класс прокси и файл конфигурации, чтобы вы могли вызвать service.

      ServiceReference1.Service1Client service1Client = new Service1Client();
        string str = "Testing";        
        byte[] array = Encoding.ASCII.GetBytes(str);
        MemoryStream stream = new MemoryStream(array);
        Console.WriteLine(service1Client.PostBusinessData(stream));
        Console.ReadLine();

Клиентская сторона может поддерживать тип запроса сервера через сгенерированный прокси-класс.

enter image description here

Это результат.

ОБНОВЛЕНИЕ

WCF поддерживает MTOM, который представляет собой замененный стандарт W3 C SwA. Это ссылка на информацию, связанную с MTOM:

https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/mtom-encoding

Для получения дополнительной информации о MTOM и SWA перейдите по следующей ссылке:

https://docs.microsoft.com/en-us/previous-versions/dotnet/articles/ms996462 (v = msdn .10)? Redirectedfrom = MSDN

В WCF, если вы хотите получать сообщение XML, которое вы даете, я думаю, вы можете используйте инспекторы сообщений, чтобы перехватить сообщение XML и проанализировать его.

    public class ServerMessageLogger : IDispatchMessageInspector
{
    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {

        string xml = ""+request;
       // Parse the received XML here
        return null;
    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {

        string xml = ""+reply;
        //Encapsulate the XML to send
    }
}

Для получения дополнительной информации об инспекторах сообщений перейдите по следующей ссылке:

https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/message-inspectors?redirectedfrom=MSDN

...