Запросить URI в MediaTypeFormatter - PullRequest
2 голосов
/ 17 декабря 2011

Я пытаюсь вывести разные форматы типа в зависимости от URL-адреса запроса.До Preview5 я делал следующее, чтобы получить URI в MediaTypeFormatters OnWriteToStream-Method:

var requestUri = OperationContext.Current
                                 .IncomingMessageHeaders
                                 .To;

Но в Preview6 свойство OperationContext.Current всегда имеет значение null.Вероятно, потому, что средство форматирования выполняется в другом потоке.Итак, как правильно получить URI в MediaTypeFormatter?Или есть альтернатива MediaTypeFormatter, в которой в качестве аргумента используется запрос?

Заранее спасибо.

С уважением

...

Иоахим

Ответы [ 3 ]

0 голосов
/ 25 декабря 2011

Ради полноты я остановился на следующем решении

public class RazorHtmlHandler : HttpOperationHandler<HttpResponseMessage, HttpResponseMessage>
{
    public static readonly String OUTPUT_PARAMETER_NAME = "response";
    public static readonly MediaTypeWithQualityHeaderValue HTML_MEDIA_TYPE = new MediaTypeWithQualityHeaderValue("text/html");

    public const String DEFAULT_TEMPLATE_NAME = "index.cshtml";
    public const String DEFAULT_TEMPLATE_EXTENSION = ".cshtml";
    public const String DEFAULT_RAZOR_NAME = "_RazorHtmlProcessor_Template";

    public RazorHtmlHandler() : base(OUTPUT_PARAMETER_NAME)
    { }

    protected override HttpResponseMessage OnHandle(HttpResponseMessage response)
    {
        var request = response.RequestMessage;
        var accept = request.Headers.Accept;

        if (!accept.Contains(HTML_MEDIA_TYPE))
            return response;

        var buffer = new StringBuilder();
        var currentContent = response.Content as ObjectContent;

        try
        {                
            var template = LoadTemplateForResponse(request.RequestUri, currentContent);
            var value = ReadValueFormObjectContent(currentContent);

            buffer.Append(InvokeRazorParse(template, value));
        }
        catch (Exception ex)
        {
            throw new HttpResponseException(HttpStatusCode.InternalServerError);
        }

        response.Content = new StringContent(buffer.ToString(), 
                                             Encoding.UTF8, 
                                             HTML_MEDIA_TYPE.MediaType);
        return response;
    }
    ...
}
0 голосов
/ 15 апреля 2013

Мы также столкнулись с этой проблемой с MediaTypeFormatter для нашего веб-API, но мы решили ее, просто используя HttpContext.Current.Request.Url вместо того, чтобы проходить через OperationContext.Current.

0 голосов
/ 17 декабря 2011

Вы можете использовать UriFormatExtensionMessageChannel / OperationHandler, как показано здесь .

...