[C#][ASP.NET Web API] Server 回應訊息處理

[C#.NET][Web API] Server 回應訊息處理

續上篇 http://www.dotblogs.com.tw/yc421206/archive/2013/11/07/127233.aspx 

我們可以觀察到當方法執行成功 Server 預設會回傳 200

SNAGHTML7fbab71

 

除了預設之外,我們可以還使用 HttpResponseMessage 、HttpResponseMessageException 來自訂回應訊息,本文章節:

自訂回應訊息

觀察例外訊息

自訂錯誤訊息


自訂回應訊息

HttpResponseMessage 類別

HttpResponseMessage 提供了以下屬性,我們可以自定更多的訊息

image

 

Content 屬性 回傳 HttpContent 抽象類別,我們可以決定要回傳什麼內容,下圖列出實作 HttpContent 的類別

image

 

除了實體化 HttpResponseMessage ,也可以使用 this.Request.CreateResponse 方法來自訂回應訊息

下面這個例子,我回應 json 格式

{
    var result = s_Repository.GetAll();
    HttpResponseMessage response = this.Request.CreateResponse(HttpStatusCode.OK);
    response.Content = new ObjectContent<IEnumerable<Product>>(result, new JsonMediaTypeFormatter());
    return response;
}

 

Client request 是 xml,Server reponse 則是 json,不過,這裡只是演練,若這樣做,可能會帶給開發人員困擾

SNAGHTML81c13d4

 

再來演練一下

 

{
    var result = s_Repository.Post(item);
    var response = Request.CreateResponse(HttpStatusCode.Created, result);
    string uri = Url.Link("DefaultApi", new { id = item.ISBN });
    response.Headers.Location = new Uri(uri);
    response.Content = new StringContent("阿母,我出運阿啦");
    return response;
}

SNAGHTML8231605

 

觀察例外訊息

我故意製造 xml 格式錯誤,觀察 reponse 結果

SNAGHTML8282212

 

訊息已經蠻完整了

SNAGHTML82ceb5a

 

 

 

自訂錯誤訊息

使用 HttpResponseException 類別+ Request.CreateResponse 自訂錯誤訊息
{
    try
    {
        var result = s_Repository.Post(item);
        var response = this.Request.CreateResponse(HttpStatusCode.Created, result);
        string uri = Url.Link("DefaultApi", new { id = item.ISBN });
        response.Headers.Location = new Uri(uri);
        response.Content = new StringContent("阿母,我出運阿啦");
        return response;
    }
    catch (Exception ex)
    {
        var msg = this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "阿母,我悲哀阿~", ex);
        var exception = new HttpResponseException(msg);
        throw exception;
    }
}

 
執行結果,如果不需要特別的處理,就讓系統自己拋出錯誤訊息
SNAGHTML8563898

 


文章出自:http://www.dotblogs.com.tw/yc421206/archive/2013/11/07/127253.aspx

 

補充:

保哥,無論任何要求都回應 JSON 格式

http://blog.miniasp.com/post/2012/10/12/ASPNET-Web-API-Force-return-JSON-format-instead-of-XML-for-Google-Chrome-Firefox-Safari.aspx

在 Global.asax 裡加上 GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
    }
}

PS.但這樣做可能會造成開發人員的困擾,服用前請三思。

 

補充:

蔡煥麟老師:http://huan-lin.blogspot.com/2013/01/aspnet-web-api-and-json.html

保留回傳 xml 能力,預設回傳 json

{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
    }
}

這解法是在 stackoverflow.com 上爬來的,其優點是依然保有傳回 XML 格式的能力,亦即預設傳回 JSON,但如果前端發出的 HTTP request 的 Accept 標頭是 "text/xml",就會傳回 XML

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo