Silverlight WCF работает с BasicHttpBinding, исключение «HTTP 415 Unsupported Media Type» при использовании CustomBinding / BinaryMessageEncoding - PullRequest
2 голосов
/ 06 сентября 2010

У меня есть приложение silverlight, которое общается со службой WCF на веб-сайте ASP.NET.Работает следующий код:

        var service = new ChannelFactory<IService>(new BasicHttpBinding()
                                                                    {
                                                                        MaxReceivedMessageSize = int.MaxValue
                                                                    }, 
                                                                    new EndpointAddress(Settings.ServiceUrl)).CreateChannel();

Но я действительно хочу воспользоваться «двоичным кодированием».Чтобы запустить службу с двоичным кодированием, вы не можете использовать BasicHttpBinding, вам нужно использовать CustomBinding!Следующий код используется в том же месте, но выдает HTTP 415 Неподдерживаемое состояние типа носителя с веб-сервера.В сеансе отладки на сервере не установлены точки останова.

            var service = new ChannelFactory<IService>(new CustomBinding(new BinaryMessageEncodingBindingElement(), new HttpTransportBindingElement()
                                                                                                                                 {
                                                                                                                                     MaxReceivedMessageSize = int.MaxValue
                                                                                                                                 }),
                                                                    new EndpointAddress(Settings.ServiceUrl)).CreateChannel(); 

Мне нужна помощь, чтобы выяснить, почему этот параметр не работает!Кстати, вот раздел службы в моей веб-конфигурации на стороне сервера:

  <system.serviceModel>
<bindings>
  <customBinding>
    <binding name="myBinding">
      <binaryMessageEncoding />
      <httpTransport authenticationScheme="Negotiate"/>
    </binding>
  </customBinding>
</bindings>
<services>
  <service name="myService">
    <endpoint address="" binding="customBinding"  bindingConfiguration="myBinding" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="wcfServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

Ответы [ 2 ]

3 голосов
/ 09 декабря 2010

Я выяснил, как включить BinaryMessageEncoding, и я могу подтвердить, что BinaryMessageEncoding работает правильно в IIS и отладочном сервере web dev для Visual Studio.

Проблема была в распространенной проблеме конфигурации WCF.Мое «имя службы» было произвольным именем, но оно ДОЛЖНО быть полностью определенным именем класса службы.Вместо того, чтобы выдавать исключение, WCF выставлял службу под некоторым поведением по умолчанию и не предупреждал меня о том, что конфигурация недействительна.

<bindings>
<customBinding>
        <binding name="myBinding" >
          <binaryMessageEncoding >
            <!--readerQuotas are used to set upper limits on message payload-->
            <readerQuotas 
              maxDepth="2147483647" 
              maxStringContentLength="2147483647" 
              maxArrayLength="2147483647" 
              maxBytesPerRead="2147483647" 
              maxNameTableCharCount="2147483647"
            />
          </binaryMessageEncoding>
          <httpTransport authenticationScheme="Ntlm"  maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"/>
        </binding>
      </customBinding>
    </bindings>
    <services>
      <!--the service name must be the fully-qualified name of the service class-->
      <service name="MyProgram.DataService">
        <!--this line allows metatada exchange-->
        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
        <endpoint address="" binding="customBinding" bindingConfiguration="myBinding" contract="MyProgram.IDataService" />
      </service>
    </services>
0 голосов
/ 06 сентября 2010

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

Попробуйте изменить привязку:

<bindings> 
  <customBinding> 
    <binding name="myBinding"> 
      <binaryMessageEncoding /> 
      <httpTransport />
    </binding> 
  </customBinding> 
</bindings>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...