Очень реальный вызов сервиса RESTful WCF с потоками - PullRequest
0 голосов
/ 27 апреля 2011

Я хочу создать веб-сервис со следующими свойствами:

  • Он использует 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 для настройки аспектов вывода так, как считаю нужным, также вручную.

1 Ответ

1 голос
/ 27 апреля 2011

Это так легко сделать с новой библиотекой WCF Web API. См. http://wcf.codeplex.com В моем блоге есть образец, который я опубликую после включения питания: -)

Интерфейс выглядит так,

[ServiceContract]
public interface IRenderService{

    [WebInvoke(Method = "POST", UriTemplate = "/render")]
    HttpResponseMessage Render(HttpRequestMessage input);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...