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

У меня есть служба 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 не поддерживают потоки.)

5
задан Mike Chamberlain 10 January 2011 в 04:39
поделиться