Ошибка отправки большого массива байтов

#silverlight #wcf

#silverlight #wcf

Вопрос:

У меня есть служба WCF, через которую я добавляю данные в базу данных. Это работает нормально, но когда я пытаюсь отправить большой байт [], он возвращает «удаленный сервер вернул ошибку: не найдено».

web.config

     <?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="JabsBaseConnectionString" connectionString="Data Source=TAHASAGHIR-PCSQLEXPRESS;Initial Catalog=JabsBase;Integrated Security=True" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
      </assemblies>
    </compilation>
    <httpRuntime maxRequestLength="2097151" useFullyQualifiedRedirectUrl="true"/>
  </system.web>
  <system.serviceModel>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="false" multipleSiteBindingsEnabled="true" />
    <bindings>
      <basicHttpBinding>
        <binding name="SendLargeChat"
                 allowCookies="false"
                 bypassProxyOnLocal="false" 
                 maxBufferPoolSize="2147483647"
                 maxReceivedMessageSize="2147483647"
                 maxBufferSize="2147483647"
                 closeTimeout="10:00:00"
                 openTimeout="10:00:00"
                 receiveTimeout="10:00:00"
                 sendTimeout="10:00:00"
                 transferMode="Streamed">
          <readerQuotas 
            maxArrayLength="2147483647"
            maxBytesPerRead="2147483647"
            maxDepth="2147483647"
            maxNameTableCharCount="2147483647"
            maxStringContentLength="2147483647" />
        </binding>
      </basicHttpBinding>      
    </bindings>
    <services>
      <service name="Prototype.SendChatService" behaviorConfiguration="Prototype.SendChatServiceBehavior">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="SendLargeChat" contract="Prototype.SendChatService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>      
    </services>    
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
        <behavior name="Prototype.SendChatServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>
  

Ссылки на сервис.ClientConfig

 <configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>        
        <binding name="BasicHttpBinding_ISendChatService" maxBufferSize="2147483647"
          maxReceivedMessageSize="2147483647">
          <security mode="None" />
        </binding>
      </basicHttpBinding>      
    </bindings>
    <client>      
      <endpoint address="http://localhost:53756/PrototypeSite/SendChatService.svc"
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISendChatService"
        contract="SendChatService.ISendChatService" name="BasicHttpBinding_ISendChatService" />
    </client>
  </system.serviceModel>
</configuration>
  

Запрос
СООБЩЕНИЕ http://localhost:53756/PrototypeSite/SendChatService.svc HTTP/1.1
Хост: localhost: 53756
Соединение: поддерживается
Реферер:http://localhost:53756/PrototypeSite/ClientBin/Prototype.xap
Длина содержимого: 1348176
soapaction: «http://tempuri.org/ISendChatService/addMsg »
тип содержимого: текст / xml; кодировка=utf-8
Принять:/
Пользовательский агент: Mozilla / 5.0 (Windows NT 6.1) AppleWebKit /534.24 (KHTML, как Gecko) Chrome / 11.0.696.68 Safari /534.24
Принять-Кодирование: gzip, deflate, sdch
Принять-Язык: en-US,en;q=0.8
Принять кодировку: ISO-8859-1, utf-8; q = 0.7,*;q = 0.3

Ответ HTTP /1.1 400 на неверный запрос сервера: ASP.NET Сервер разработки / 10.0.0.0 Дата: Чт, 26 мая 2011 17:48:00 GMT X-AspNet-Версия: 4.0.30319 Управление кэшем: приватный контент-Длина: 0 Соединение: закрыто

Ответ №1:

Ошибка 404 / Not Found — это ошибка, о которой Silverlight сообщает для всех ошибок сервера. Если вы хотите узнать фактическую ошибку, возвращаемую с сервера, вы можете использовать что-то вроде Fiddler для просмотра того, что отправляется и принимается, включая заголовки, которые содержат фактический код ошибки и сообщение об ошибке, возвращаемое сервером.

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

1. Спасибо, Дэвид… Я редактирую свой оригинальный пост! Пожалуйста, проверьте запрос и ответ.

2. Ошибочный запрос может быть вызван несколькими причинами: отправленный XML-файл поврежден (вы можете проверить это в Fiddler, посмотреть, можно ли просмотреть данные запроса в формате XML), контракт, используемый запросом, не совпадает с контрактом сервера (маловероятно, если вы написали оба из одного и того же кода WCF), или запрос нарушает проверку диапазона. Превышает ли запрос 64 КБ? Возможно, это нарушает ограничение maxReceivedMessageSize по умолчанию, установленное в вашей службе WCF.

Ответ №2:

Я думаю, вам следует применить то же самое

 <readerQuotas ...
  

На клиенте.

Ответ №3:

попробуйте добавить параметр executionTimeout к вашему параметру HttpRuntime

 <httpRuntime executionTimeout="110" maxRequestLength="..." />
  

Ответ №4:

По моему опыту, я получал сообщение об ошибке, потому что, хотя служба на сервере была настроена на прием большого объема данных, среда выполнения http этого не делала. Убедитесь, что ваш HttpRuntime имеет соответствующую длину maxRequestLength.

Ответ №5:

Вы также можете включить ведение журнала WCF для получения дополнительной информации. Добавьте следующее в свой web.config:

 <system.diagnostics>
    <sources>
        <source name="System.ServiceModel"
                  switchValue="Information, ActivityTracing"
                  propagateActivity="true">
            <listeners>
                <add name="traceListener"
                     type="System.Diagnostics.XmlWriterTraceListener"
                     initializeData= "c:logTraces.svclog" />
            </listeners>
        </source>
    </sources>
</system.diagnostics>
  

Ответ №6:

ИЗВИНИТЕ, МОЙ ОТВЕТ НЕВЕРЕН!! ИГНОРИРУЙТЕ ЭТО

Я удалю это через несколько часов, просто разрешив людям с комментариями увидеть это.

Не отправляйте массивы байтов в SOAP.

Каждый байт будет передан как <byte>128</byte> или аналогичный, что означает, что потребуется в среднем в 10 раз больше.

Вместо этого используйте строку base64 — поэтому определите свое свойство как строку и заполните его как строку base64.

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

1. Алиостад, спасибо за твой быстрый ответ! Не могли бы вы, пожалуйста, рассказать о процессе, как преобразовать массив байтов в строку base64 и наоборот?

2. вау. Это действительно кое-что полезное знать. У вас есть ссылка, которая объясняет это?

3. Это звучит неправильно… Я почти уверен, что byte[] сериализатором кодируется как строка Base64 … например webservices20.blogspot.com/2010/10 /…

4. Извините за заблуждение… смотрите мои комментарии. Однажды узнает что-то каждый день