簡體   English   中英

更改ASP.NET Web API的媒體類型Formatter上的響應標頭

[英]Change Response Headers on Media Type Formatter for ASP.NET Web API

我創建了一個ASP.NET Web API控制器,它在一個動作上返回一個強類型對象,如下所示:

// GET api/iosdevices/5
public iOSDevice Get(string id) {
  return new iOSDevice();
}

我創建了一個BufferedMediaTypeFormatter來處理iOSDevice類型:

public class iOSDeviceXmlFormatter : BufferedMediaTypeFormatter
{
    public iOSDeviceXmlFormatter() {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/xml"));
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xml"));
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    }

    public override void WriteToStream(Type type, object value, Stream writeStream, HttpContent content) {
        content.Headers.ContentType = new MediaTypeHeaderValue("application/xml");
        iOSDevice device = (iOSDevice)value;
        using (XmlWriter writer = XmlWriter.Create(writeStream)) {
            writer.WriteStartElement("iOSDevice");
            if (device.identifierForVendor != Guid.Empty) {
                writer.WriteElementString("identifierForVendor", device.identifierForVendor.ToString());
                writer.WriteElementString("userInterfaceIdiom", device.userInterfaceIdiom);
                writer.WriteElementString("systemName", device.systemName);
                writer.WriteElementString("systemVersion", device.systemVersion);
                writer.WriteElementString("model", device.model);
            }
            writer.WriteEndElement();
        }
        writeStream.Close();
    }
}

我的問題是當我抓住“text / html”類型時(例如有人試圖從他或她的網絡瀏覽器訪問API),響應類型是“text / html”而不是“application / xml”。 我想覆蓋響應類型,以便用戶獲得“application / xml”而不是“text / html”的響應。

我不能在ApiController類型中訪問常規MVC控制器上的“Response”屬性,我不知所措。 如何覆蓋媒體類型格式化程序正在處理的此操作的響應類型?

編輯:有用的注意事項

我之前嘗試過這個:

var response = Request.CreateResponse<iOSDevice>(HttpStatusCode.Accepted, device);
response.Headers.Remove("Content-Type");
response.Headers.Add("Content-Type", "application/xml; charset=utf-8");
return response;

它聲稱我“濫用”標題。

但是當我使用Filip的例子直接設置內容時,它起作用了!

var response = Request.CreateResponse();
response.Content = new ObjectContent<iOSDevice>(device, new iOSDeviceXmlFormatter());
return response;

當您在格式化程序中寫入流時,標題已經發送。

你可以這樣做:

    public HttpResponseMessage Get(string id) {
    {
        var value = new iOSDevice();
        var response = Request.CreateResponse();
        response.Content = new ObjectContent(typeof(iOSDevice), value, new iOSDeviceXmlFormatter());
        //set headers on the "response"
        return response;
    }

或者您可以這樣做(將此方法添加到您的格式化程序):

    public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, string mediaType)
    {
        base.SetDefaultContentHeaders(type, headers, mediaType);
        headers.ContentType = new MediaTypeHeaderValue("application/xml");
    }

以下是我如何將SetDefaultContentHeaders與自定義格式化程序一起使用的示例: http//www.strathweb.com/2012/09/generate-kindle-mobi-ebooks-with-your-asp-net-web-api/

   public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
   {
      if (CanWriteType(type) && mediaType.MediaType == supportedMediaType)
      {
         headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
         headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
         headers.ContentDisposition.FileName = "ebook.mobi";
      }
      else
      {
         base.SetDefaultContentHeaders(type, headers, mediaType);
      }
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM