HttpResponseMessage 无法序列化内容

本文关键字:序列化 HttpResponseMessage | 更新日期: 2023-09-27 17:57:12

>我有空的.net rest api,它只接受XML。如果控制器方法直接返回我要序列化的类,则没有问题。但是我想使用响应包装器,以便所有控制器方法都返回HttpResponseMessage

所以这有效:FooController.cs:

public FooResponse PostFoo(FooRequest foo)
{
  var fooVal = fooBll.GetFoo();
  return new FooResponse { Foo = fooVal;};
}

但这不会:FooController.cs:

public HttpResponseMessage PostFoo(FooRequest foo)
{
  var fooVal = fooBll.GetFoo();
  HttpResponseMesage response;
  response = fooBll.GetSuccessResponse(Url, new FooResponse {Foo = foovVal;});
  return response ;
}

ResponseBLL.cs:

public HttpResponseMessage GetSuccessResponse(UrlHelper Url, object obj)
{
    this.requestMsg = HttpContext.Current.Items["MS_HttpRequestMessage"] as HttpRequestMessage;
    this.responseMsg = this.requestMsg.CreateResponse(HttpStatusCode.OK, obj);
    this.responseMsg.Headers.Location = HttpContext.Current.Request.Url;
    return this.responseMsg;
}

FooBLL继承了ResponseBLL,这就是为什么我可以称fooBll.GetSuccessResponse

在WebApiConfig中.cs我有:

config.Formatters.XmlFormatter.UseXmlSerializer = true;
config.Formatters.Remove(config.Formatters.JsonFormatter);

我得到的错误是

FooResponse 类型不是预期的。使用 XmlInclude 或 属性,用于指定静态未知的类型。

现在我知道这个问题已经有很多问题了,相信我,我已经经历了所有这些问题,但没有成功。我已经尝试了[DataContract], [DataMember], [Serializable]并以我能想到的所有可能的组合[XmlInclude]属性。 [XmlInclude(typeof(FooResponse))] FooBLL类,[XmlInclude(typeof(FooBLL))] ResponseBLL等。

我希望你能帮助我。

HttpResponseMessage 无法序列化内容

HttpRequestMessageExtensions.CreateResponse<T>()是一个

通用方法。 T Value参数必须正确键入,而不是声明为object,例如:

public HttpResponseMessage GetSuccessResponse<T>(UrlHelper Url, T obj)
{
    this.requestMsg = HttpContext.Current.Items["MS_HttpRequestMessage"] as HttpRequestMessage;
    this.responseMsg = this.requestMsg.CreateResponse(HttpStatusCode.OK, obj);
    this.responseMsg.Headers.Location = HttpContext.Current.Request.Url;
    return this.responseMsg;
}

此解决方案之所以有效XmlMediaTypeFormatter是因为使用 typeof(T) 而不是 value.GetType() 构造其XmlSerializer。 从源代码:

    protected internal virtual object GetSerializer(Type type, object value, HttpContent content)
    {
        return GetSerializerForType(type);
    }

我们可以看到,只有type(作为ObjectContent<T> typeof(T)传入WriteToStreamAsync())用于序列化程序构造。 object value不是。 Microsoft本可以选择使用value.GetType(),但没有。 然后序列化程序抛出异常,因为传入的根对象的实际类型(在本例中typeof(Foo))与用于构造序列化程序的类型(typeof(object))或已知类型的object不同。