WCF web.config: разрешение заголовков SOAP в базовой привязке HttpBinding через HTTP (не HTTPS)

#c# #rest #wcf #soap #web-config

#c# #остальное #wcf #soap #web-config

Вопрос:

У меня НЕТ HTTPS (SSL) в моем поддомене, поэтому в качестве такого HTTPS ничего нет, только HTTP.

У меня есть одна операция в моей службе WCF, для которой требуется SOAP, по крайней мере, согласно сообщениям об ошибках, поскольку возвращаемый тип сложный.

 [OperationContract(IsOneWay = false)]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
    FileDownloadReturnMessage DownloadFile(FileDownloadMessage request);
  

Мне пришлось изменить мою безопасность привязки на None , поскольку Transport требуется HTTPS, по крайней мере, из сообщений об ошибках, которые я получил; то же самое для WsHttpBinding , следовательно, сейчас basicHttpBinding . На данный момент web.config имеет 3 привязки: webHttpBinding , basicHttpBinding и mex .

Проблема в том, что SOAP и HTTP кажутся несовместимыми. Вот сообщение об ошибке, которое я вижу, когда я вставляю URL-адрес в браузер Google Chrome:

[Исключение InvalidOperationException: Операция ‘DownloadFile’ в контракте ‘ICloudService’ использует MessageContract, который имеет заголовки SOAP. Заголовки SOAP не поддерживаются None MessageVersion.]

Вот URI:

 http://mycloud.thedomain.com/Communication/CloudService.svc/AddressWs
  

Следующий URI выдает ту же ошибку.

 http://mycloud.thedomain.com/Communication/CloudService.svc/AddressWeb
  

Вот web.config :

 <?xml version="1.0"?>
<configuration>
  <system.web>
        <customErrors mode="Off"/>
    <compilation debug="true" targetFramework="4.6.2"/>
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=amp;quot;Webamp;quot; /optionInfer "/>
    </compilers>
  </system.codedom>
    <system.serviceModel>
        <services>
            <service name="MyCloud.Communication.CloudService" behaviorConfiguration="BehaviorMyCloudService">
                <endpoint address="/AddressWeb"
                                    binding="webHttpBinding"
                                    bindingConfiguration="EndpointBindingMyCloudService"
                                    contract="MyCloud.Communication.ICloudService"
                                    behaviorConfiguration="endpointBehaviorWeb"
                                    >
                    </endpoint>
                <endpoint address="/AddressWs"
                                    binding="basicHttpBinding"
                                    bindingConfiguration="EndpointBindingMyCloudService"
                                    contract="MyCloud.Communication.ICloudService"
                                    behaviorConfiguration="endpointBehaviorWs"
                                    >
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:80/"/>
                    </baseAddresses>
                </host>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="BehaviorMyCloudService">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
                    <serviceDebug includeExceptionDetailInFaults="true" />
                    <dataContractSerializer maxItemsInObjectGraph="2147483647" />
                    <useRequestHeadersForMetadataAddress>
                        <defaultPorts>
                            <add scheme="http" port="80" />
                        </defaultPorts>
                    </useRequestHeadersForMetadataAddress>
                </behavior>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
            <endpointBehaviors>
                <behavior name="endpointBehaviorWeb">
                    <webHttp defaultOutgoingResponseFormat="Xml" />
                </behavior>
                <behavior name="endpointBehaviorWs">
                    <webHttp defaultOutgoingResponseFormat="Xml" />
                </behavior>
            </endpointBehaviors>
        </behaviors>
        <protocolMapping>
            <add scheme="http" binding="webHttpBinding" bindingConfiguration="EndpointBindingMyCloudService" />
            <add scheme="https" binding="webHttpBinding" bindingConfiguration="EndpointBindingMyCloudService" />
        </protocolMapping>
        <bindings>
            <webHttpBinding>
                <binding
                    name="EndpointBindingMyCloudService"
                    allowCookies="false"
                    closeTimeout="00:01:00"
                    openTimeout="00:01:00"
                    receiveTimeout="00:10:00"
                    sendTimeout="00:01:00"
                    maxBufferPoolSize="524288"
                    maxReceivedMessageSize="2147483647"
                    useDefaultWebProxy="true"
                    >
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"></transport>
                    </security>
                </binding>
            </webHttpBinding>
            <basicHttpBinding>
                <binding
                    name="EndpointBindingMyCloudService"
                    allowCookies="false"
                    closeTimeout="00:01:00"
                    openTimeout="00:01:00"
                    receiveTimeout="00:10:00"
                    sendTimeout="00:01:00"
                    maxBufferPoolSize="524288"
                    maxReceivedMessageSize="2147483647"
                    useDefaultWebProxy="true"
                    >
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"></transport>
                        </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
            <baseAddressPrefixFilters>
                <add prefix="http://localhost:80"/>
            </baseAddressPrefixFilters>
        </serviceHostingEnvironment>
    </system.serviceModel>
</configuration>
  

Мой код C # выдает досадную ошибку:

ex = {«Запрошенный сервис, ‘http://mycloud.thedomain.com/Communication/CloudService.svc/AddressWs ‘ не удалось активировать. Смотрите журналы трассировки диагностики сервера для получения дополнительной информации «.}

Я получаю больше пробега, используя URL-адрес в браузере Chrome.

Какие изменения мне нужно внести в мой web.config , чтобы получить сложные возвращаемые значения и по-прежнему использовать HTTP?

Комментарии:

1. Служба прослушивает порт 80 локального хоста. Вы подключаетесь к mycloud.thedomain.com . Они одинаковые?

2. @jdweng Моя веб-хостинговая компания указала мне использовать порт 80. Я загрузил сайт, web.config показанный выше, подключившись к сайту со своего рабочего стола с помощью настольного приложения C # WinForms и отдельно моего браузера Google Chrome. Если я понимаю ваш вопрос, да. Поддомен, mycloud.thedomain.com с точки зрения веб-службы WCF является localhost . Мой рабочий стол, конечно, нет.

3. Если вы можете подключиться с помощью Google Chrome, тогда используйте сниффер, такой как wireshark или fiddler, и зафиксируйте хорошее соединение. Затем сравните с плохим соединением. Посмотрите на заголовки в первоначальном запросе. Сделайте заголовки приложений c # похожими на рабочее соединение.

4. @jdweng В этом и суть. Я НЕ МОГУ подключиться в любом случае. Я выдал ошибку браузера и ошибку C #. Оба выдали ошибки. Кажется, что SOAP требует SSL или security = transport, но HTTP (без SSL) требует security = None, уловка 22, отсюда и мой вопрос. Должно быть возможно сделать и то, и другое. Я просто не знаю как.

5. Пожалуйста, взгляните на следующий блог. blogs.msdn.microsoft.com/carlosfigueira/2008/04/17/… На мой взгляд, вы можете попытаться разбить контракт на два отдельных контракта на обслуживание. Один помечен как restful, а другой — как soap. Кроме того, почему бы не попробовать использовать тип контракта данных в качестве возвращаемого типа?