#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. Кроме того, почему бы не попробовать использовать тип контракта данных в качестве возвращаемого типа?