Я хочу создать веб-сервис со следующими свойствами:
- Он использует WCF и .NET 4.0
- Он размещен в IIS7
- ЭтоRESTful
- Можно сохранить стандартное поведение вывода при сборе и обработке WebFaultExceptions и т. Д.
- У него есть один вызов, который
- ест голый HTTP POST изпотенциально огромные двоичные файлы (желательно не хранить в памяти!)
- принимает поток в качестве входных данных
- выводит поток
- использует UriTemplate для сопоставления (будетбольше звонков в ближайшее время)
- хочет, чтобы потоки были полностью необработанными, а NOT имеют IIS или WCF, которые стараются быть умными, обрабатывая тип контента любым способом
Проблема в том, что IIS и / или WCF продолжают вмешиваться в тип контента, настаивая на возвращении
415 Cannot process the message because the content type '...' was not the expected type 'text/xml; charset=utf-8'
независимо от типа контента.Можете ли вы найти какие-либо ошибки, которые я сделал ниже?
[ServiceContract]
public interface IRenderService
{
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/render", BodyStyle = WebMessageBodyStyle.Bare)]
Stream Render(Stream input);
}
С помощью следующих фрагментов из Web.config:
<system.web>
<compilation debug="true" targetFramework="4.0" />
<httpRuntime maxRequestLength="500000000" />
</system.web>
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding
name="FileStreamConfiguration"
transferMode="Streamed"
maxReceivedMessageSize="500000000"
maxBufferSize="500000000"
openTimeout="00:25:00"
closeTimeout="00:25:00"
sendTimeout="00:25:00"
receiveTimeout="00:25:00" />
</webHttpBinding>
</bindings>
<services>
<service name="RenderService" behaviorConfiguration="RenderServiceBehavior">
<endpoint address="" binding="webHttpBinding" contract="RenderServer.IRenderService" bindingConfiguration="FileStreamConfiguration" behaviorConfiguration="RenderEndpointBehaviour" >
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="RenderServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="RenderEndpointBehaviour">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
Я хочу всегда получать необработанное содержимое тела HTTP POSTи извлекать заголовки из WebOperationContext.Current.IncomingRequest
вручную, если я сочту это необходимым, и IIS / WCF должен полностью игнорировать все аспекты запроса, кроме его анализа и отправки в мой код.Я буду использовать WebOperationContext.Current.OutgoingResponse
для настройки аспектов вывода так, как считаю нужным, также вручную.