Потоковая передача двоичных данных в службу отдыха WCF дает неверный запрос (400), когда длина содержимого превышает 64 КБ. - PullRequest
5 голосов
/ 10 января 2011

У меня есть служба WCF, которая принимает поток:

[ServiceContract]
public class UploadService : BaseService
{
    [OperationContract]
    [WebInvoke(BodyStyle=WebMessageBodyStyle.Bare, Method=WebRequestMethods.Http.Post)]
    public void Upload(Stream data)
    {
        // etc.         
    }
}

Этот метод позволяет моему приложению Silverlight загружать большие двоичные файлы, самый простой способ заключается в создании HTTP-запроса вручную от клиента.,Вот код в клиенте Silverlight, который делает это:

const int contentLength = 64 * 1024;  // 64 Kb

var request = (HttpWebRequest)WebRequest.Create("http://localhost:8732/UploadService/");
request.AllowWriteStreamBuffering = false;
request.Method = WebRequestMethods.Http.Post;
request.ContentType = "application/octet-stream";
request.ContentLength = contentLength;
using (var outputStream = request.GetRequestStream())
{
     outputStream.Write(new byte[contentLength], 0, contentLength);
     outputStream.Flush();
     using (var response = request.GetResponse());
}

Теперь, в случае выше, где я передаю 64 КБ данных (или меньше), это работает нормально и если я установлю точку останова в своем методе WCF, и я смогу исследовать поток и увидеть нули на 64 кБ - ура!

Проблема возникает, если я отправляю данные размером более 64 КБ , например, изменив первую строку моего клиентского кода на следующее:

const int contentLength = 64 * 1024 + 1; // 64 kB + 1 B

Теперь это вызывает исключение на клиенте, когда я вызываю request.GetResponse ():

Удаленный сервер возвратил ошибку: (400) Плохой запрос.

В конфигурации WCF сервера я установил maxReceivedMessageSize, maxBufferSize и maxBufferPoolSize в 2147483647, но безрезультатно.Вот соответствующие разделы из app.config моего сервиса:

<service name="UploadService">
    <endpoint address="" 
              binding="webHttpBinding" 
              bindingName="StreamedRequestWebBinding"
              contract="UploadService" 
              behaviorConfiguration="webBehavior">
        <identity>
            <dns value="localhost" />
        </identity>
    </endpoint>
    <host>
        <baseAddresses>
            <add baseAddress="http://localhost:8732/UploadService/" />
       </baseAddresses>
    </host>       
</service>

<bindings>
    <webHttpBinding>
        <binding name="StreamedRequestWebBinding" 
                 bypassProxyOnLocal="true"
                 useDefaultWebProxy="false"
                 hostNameComparisonMode="WeakWildcard"
                 sendTimeout="00:05:00"
                 openTimeout="00:05:00"
                 receiveTimeout="00:05:00"
                 maxReceivedMessageSize="2147483647"
                 maxBufferSize="2147483647"
                 maxBufferPoolSize="2147483647"
                 transferMode="StreamedRequest">
            <readerQuotas maxArrayLength="2147483647"
                          maxStringContentLength="2147483647" />
        </binding>
    </webHttpBinding>
</bindings>

<behaviors>
    <endpointBehaviors>
        <behavior name="webBehavior">
            <webHttp />
        </behavior>
    <endpointBehaviors>
</behaviors>

Как мне сделать так, чтобы мой сервис принимал более 64 КБ потоковых данных поста?

Редактировать : как показано в клиентском коде выше, я не использую ссылки на службы, а скорее создаю HTTP-запрос вручную.(Это потому, что ссылки на службы Silverlight не поддерживают потоки.)

Ответы [ 2 ]

5 голосов
/ 11 января 2011

Итак, я нашел проблему - bindingName="StreamedRequestWebBinding" должно быть bindingConfiguration="StreamedRequestWebBinding". В первом случае указанная конфигурация привязки вообще не использовалась, поэтому maxReceivedMessageSize по умолчанию составляет 64 КБ.

0 голосов
/ 10 января 2011

В вашем приложении Silverlight также есть файл ServiceReferences.ClientConfig, вы должны обновить maxBufferSize и maxReceivedMessageSize в этой конфигурации.

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