fiddler HTTP / 1.1 415 Ошибка, так как тип содержимого 'multipart / form-data;«Приложение / ХОР + XML - PullRequest
0 голосов
/ 28 октября 2019

У меня есть WCF https://localhost/SupportingDocsFacade/NextGenService.svc/Upload. Я пытаюсь использовать fiddler composer для доступа к службе и получил следующую ошибку

HTTP / 1.1 415 Не удается обработать сообщение, так как тип содержимого 'multipart / form-data;border = ------------------------- acebdf13572468 'не был ожидаемым типом' multipart / related;type = "application / xop + xml" '.

Веб-служба ожидает вложение файла вместе со службой. Поэтому я прикрепляю файл к композитору enter image description here

Ниже приводится webconfig на сервере WCF

<wsHttpBinding>
        <binding messageEncoding="Mtom" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" name="WsBinding" transactionFlow="false" textEncoding="utf-8"  >
          <security mode ="TransportWithMessageCredential">
            <message clientCredentialType="UserName"></message>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

И далее описывается часть поведения в веб-конфигурации

 <behavior name="NextGenServiceBehavior">
          <serviceMetadata httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        <serviceCredentials>

            <userNameAuthentication userNamePasswordValidationMode="Custom"
             customUserNamePasswordValidatorType="SupportingDocsFacade.ServiceAuthenticator,SupportingDocsFacade" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>

<service behaviorConfiguration="NextGenServiceBehavior" name="SupportingDocsFacade.NextGenService">
        <endpoint address="/Upload" binding="wsHttpBinding" bindingConfiguration="WsBinding" name="Basic" contract="SupportingDocsFacade.INextGenService" />

      </service>

Я пытался сделать то же самое с SOAP UI, но не получил результата.

Затем я попытался работать с клиентским интерфейсом и протестировал. Также выдается следующее сообщение об ошибке

Отправитель - сообщение не может быть обработано. Это наиболее вероятно, потому что действие 'http://tempuri.org/INextGenService/UploadDocNextGen' является неправильным, или потому что сообщение содержит недопустимый или просроченный токен контекста безопасности или из-за несоответствия между привязками. Маркер контекста безопасности будет недействительным, если служба прервет канал из-за неактивности. Чтобы предотвратить прерывание бездействующими сеансами службы преждевременно, увеличьте тайм-аут приема для привязки конечной точки службы.

Ниже приведен клиентский appconfig

 <system.serviceModel>
        <client>
            <endpoint address="https://localhost/SupportingDocsFacade/NextGenService.svc/Upload"
                binding="wsHttpBinding" bindingConfiguration="Basic" contract="NextGenService.INextGenService"
                name="Basic" />
        </client>
        <bindings>
            <wsHttpBinding>
                <binding name="Basic" messageEncoding="Mtom">
                    <security mode="Transport">
                        <transport clientCredentialType="None" />
                        <message clientCredentialType="UserName" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>

    </system.serviceModel>
.

1 Ответ

0 голосов
/ 30 октября 2019

Ключ к проблеме заключается в том, что что-то не так с вызовом веб-службы SOAP. общий способ вызова службы WCF, созданной Wshttpbinding, - это отправить клиентский запрос с использованием прокси-класса. Таким образом, мы либо меняем способ вызова службы, либо создаем Rest API с помощью привязки Webhttp. Вы можете называть только услугу в стиле отдыха.
Пожалуйста, используйте способ создания службы ниже.
IService.

   [OperationContract]
        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json,BodyStyle =WebMessageBodyStyle.Bare)]
        Task UploadStream(Stream stream);

Service1.svc

public async Task UploadStream(Stream stream)
{
    var context = WebOperationContext.Current;
    string filename = context.IncomingRequest.Headers["filename"].ToString();
    string ext = Path.GetExtension(filename);
    using (stream)
    {
        //save the image under the Uploads folder on the server-side(root directory).
        using (var file = File.Create(Path.Combine(HostingEnvironment.MapPath("~/Uploads"), Guid.NewGuid().ToString() + ext)))
        {
            await stream.CopyToAsync(file);
        }
    }
}

webconfig.

<system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" name="httpbinding">
          <security mode="None">
          </security>
          <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="2147473647" maxNameTableCharCount="2147483647" maxStringContentLength="2147483647"/>
        </binding>
        <binding name="httpsbinding" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
          <security mode="Transport">
            <transport clientCredentialType="None"></transport>
          </security>
          <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="2147473647" maxNameTableCharCount="2147483647" maxStringContentLength="2147483647"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior>
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <protocolMapping>
      <!--http and https are all supported.-->
      <add binding="webHttpBinding" scheme="http" bindingConfiguration="httpbinding"/>
      <add binding="webHttpBinding" scheme="https" bindingConfiguration="httpsbinding"/>
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

...