WCF web.config: разрешение заголовков SOAP в BasicHttpBinding через HTTP (не HTTPS) - PullRequest
0 голосов
/ 02 апреля 2019

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

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

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

Мне пришлось изменить Binding Security на 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=\&quot;Web\&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?

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