2013-10-30 18 views
5

Özel bir ortam biçimlendiricisi uygulamam ve istemci "csv" biçimini özellikle istediğinde harika çalışıyor. Bu kod ile benim API kontrolör test ettikWebAPI eylemi için varsayılan Medya Biçimlendirici'yi ayarlama

: Bir web tarayıcısından aynı URL'yi açtığınızda

 HttpClient client = new HttpClient(); 
     // Add the Accept header 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/csv")); 

Ancak, JSON değil CSV döndürür. Bu, arayan tarafından aksi belirtilmedikçe JSON'u varsayılan ortam biçimlendiricisi olarak ayarlayan standart ASP.NET WebAPI yapılandırmasından kaynaklanmaktadır. Bu varsayılan davranışı sahip olduğum diğer tüm Web hizmetlerinde istiyorum, ancak bu tek işlemde CSV'yi döndürür. Varsayılan medya işleyicisinin uyguladığım CSV işleyicisi olmasını istiyorum. Denetleyicinin uç noktasını, varsayılan olarak CSV'yi döndürecek ve yalnızca istemci tarafından istenirse JSON/XML'i döndürecek şekilde nasıl yapılandırabilirim?

cevap

0

Hangi Web API sürümünü kullanıyorsunuz?

Eğer 5.0 sürümünü kullanıyorsanız, aşağıdaki gibi yeni IHttpActionResult tabanlı mantığı kullanabilirsiniz:

public IHttpActionResult Get() 
{ 
    MyData someData = new MyData(); 

    // creating a new list here as I would like CSVFormatter to come first. This way the DefaultContentNegotiator 
    // will behave as before where it can consider CSVFormatter to be the default one. 
    List<MediaTypeFormatter> respFormatters = new List<MediaTypeFormatter>(); 
    respFormatters.Add(new MyCsvFormatter()); 
    respFormatters.AddRange(Configuration.Formatters); 

    return new NegotiatedContentResult<MyData>(HttpStatusCode.OK, someData, 
        Configuration.Services.GetContentNegotiator(), Request, respFormatters); 
} 

Web API 4.0 sürümünü kullanıyorsanız, o zaman şu olabilir:

public HttpResponseMessage Get() 
{ 
    MyData someData = new MyData(); 

    HttpResponseMessage response = new HttpResponseMessage(); 

    List<MediaTypeFormatter> respFormatters = new List<MediaTypeFormatter>(); 
    respFormatters.Add(new MyCsvFormatter()); 
    respFormatters.AddRange(Configuration.Formatters); 

    IContentNegotiator negotiator = Configuration.Services.GetContentNegotiator(); 
    ContentNegotiationResult negotiationResult = negotiator.Negotiate(typeof(MyData), Request, respFormatters); 

    if (negotiationResult.Formatter == null) 
    { 
     response.StatusCode = HttpStatusCode.NotAcceptable; 
     return response; 
    } 

    response.Content = new ObjectContent<MyData>(someData, negotiationResult.Formatter, negotiationResult.MediaType); 

    return response; 
}