2013-01-07 11 views
13

ASP.NET Web API için Medya Türü Formatter tarih:Değişim Yanıt Başlıkları aşağıdaki gibi ben, bir eylem üzerinde kesinlikle yazılı bir nesne döndürüyor bir ASP.NET web API denetleyicisi yarattık

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

ben yarattık bir BufferedMediaTypeFormatter tipi iOSDevice işlemek için: Ben türünü yakalamak zaman

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(); 
    } 
} 

Benim sorunum "text/html", tepki türüdür "metni (örn birisi kendi web tarayıcınızın gelen API erişmeye çalıştığında) olduğu/html "yerine" application/xml ". Yanıt türünü geçersiz kılmak istiyorum, böylece kullanıcı "text/html" yerine "application/xml" şeklinde bir yanıt alır.

ApiController türünde normal MVC denetleyicilerinde bulunan "Response" özelliğine erişemiyorum ve ben bir kayıp yaşıyorum. Medya türü biçimlendirici tarafından işlenen bu eylemin yanıt türünü nasıl geçersiz kılarım?

DÜZENLEME:

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; 

Ve ben başlıklarını "kötüye" olduğunu iddia: YARARLI NOT

Bu konuya daha önce çalışıyordu.

Ancak Filip’in İçeriği doğrudan belirleme örneğini kullandığımda, işe yaradı!

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

ContentType bir yanıt değil başlık, bu bir faydalı başlıktır. Bu yüzden cevap verebilirsiniz.Kontum.Headers.ContentType = ... –

cevap

18

Biçimlendiricide akışa yazdığınızda, başlıklar zaten gönderilmiştir.

Bunu yapabilirsin:

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; 
    } 

veya bunu yapabilirsiniz (sizin biçimlendiricisine için bu yöntemi ekleyin): Burada

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

Bir özel ile SetDefaultContentHeaders kullanılan nasıl bir örnektir biçimlendirici: 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); 
     } 
    } 
+0

Parlak! İşe yaradı! Ancak ... şu anlama gelmedi: var response = Request.CreateResponse (HttpStatusCode.Accepted, device); \t \t response.Headers.Remove ("İçerik Türü"); \t \t \t response.Headers.Add ("Content-Type", "application/xml; charset = utf-8"); \t \t \t yanıt yanıtı; İçerik özelliğini ayarlayarak, söylediğiniz şekilde yapmak zorundaydım. Teşekkür ederim!! –

+0

Takip eden soru. Dosya adını, biçimlendiriciden değiştirmek mümkün mü, bu nedenle dosya adı genel olarak "ebook.mobi" ye ayarlanmak yerine, her bir talebe özeldir? –

İlgili konular