我已經創建了一個行動返回一個強類型對象的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的」(例如有人試圖從他或她的Web瀏覽器訪問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的例子來設置Content時,它工作正常!
var response = Request.CreateResponse();
response.Content = new ObjectContent<iOSDevice>(device, new iOSDeviceXmlFormatter());
return response;
ContentType不是響應頭,它是一個有效載荷頭。所以你可以做response.Content.Headers.ContentType = ... –