【问题标题】:Web API returns XML contentWeb API 返回 XML 内容
【发布时间】:2014-09-30 21:07:02
【问题描述】:

网络 API:

 public int Post(MyModel m){
    return CreateTask(m);
 }

返回值:

Id:"<int xmlns="http://schemas.microsoft.com/2003/10/Serialization/">1446</int>"

我的问题:为什么 web API 返回 ID 如上所述。我需要它作为“1446”。我怎样才能摆脱这个 xml 部分?

【问题讨论】:

  • WebAPI 将回答(通常)返回 xml 或 JSON 给客户端。如果您需要不同类型的答案,则需要编写一个处理程序来执行此操作。但这似乎使事情过于复杂恕我直言。客户端不能只接受 JSON 或 xml 吗?并将回复转换为整数?
  • 只是为了澄清您的问题。您正在获取 xml 但想要获取 Json 或者您只想要一个纯字符串?

标签: c# asp.net asp.net-web-api2


【解决方案1】:

WebApi 项目在 Global.asax 中配置;在那里你会找到一个名为WebApiConfig 的类。在这个类中,你会发现“Media Formatters”; Media Formatters 表示您的 WebApi 是否能够序列化/反序列化 JSON System.Net.Http.Formatting.JsonMediaTypeFormatter()、XML 或任何其他格式。

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
           //...

            System.Web.Http.GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
            config.Formatters.Insert(0, new System.Net.Http.Formatting.JsonMediaTypeFormatter());
            config.Formatters.Insert(0, new System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter());


        }
    }

如果 JSON 格式化程序是您列表中的第一项,它将是您的默认序列化程序/反序列化程序,以便访问任何其他格式请求的内容类型应明确指出所需的格式,如果支持,它将返回它并如果不是,它将以默认格式返回。

您看到的输出结果完全由所选媒体格式化程序使用的反序列化/序列化负责。

【讨论】:

  • Great.Thanks.Your solution is working.But I would like to ask a question.即使没有使用上述 json 格式化程序,它在大多数情况下都有效。为什么会出现这种奇怪的行为?
  • 我想到的唯一可以改变行为的是请求的内容类型。
  • 是的。非常感谢您的出色回答。 :)
  • 这会导致稍后当另一个开发者进来并期望 WebAPI 正常工作时出现问题。
  • @frenchie 你完全错了......正如我在帖子中解释的那样,第一个媒体格式化程序是默认的,另一个将根据内容类型工作。你对错误的理解是错误的。
【解决方案2】:

如果您只想返回 1446,则需要返回 HttpResponseMessage,如下所示:

public HttpResponseMessage Post(Event_model event)
{

HttpResponseMessage TheHTTPResponse = new HttpResponseMessage();
TheHTTPResponse.StatusCode = System.Net.HttpStatusCode.OK;
TheHTTPResponse.Content = new StringContent(Event.CreateEvent(event).ToString(), Encoding.UTF8, "text");

return TheHTTPResponse;

}

如果您全局更改配置,那么当您实现需要返回某种其他格式的 Web 服务时,可能会导致问题。通过返回 HttpResponseMessage,您只需担心您正在处理的特定方法。

【讨论】:

  • 你完全错了......正如我在帖子中解释的那样,第一个媒体格式化程序是默认的,另一个将根据内容类型工作。你对错误的理解是错误的
【解决方案3】:

在您的请求中,将 Accept 标头设置为 application/json:

Accept: application/json

【讨论】:

  • 他没提,好像是想去掉xml部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
相关资源
最近更新 更多