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