我有空的.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或 SoapInclude属性用于指定静态未知的类型。
现在我知道这个问题已经有很多问题了,相信我,我已经完成了所有这些问题并没有成功。我在所有可能的组合中尝试了[DataContract], [DataMember], [Serializable]
和[XmlInclude]
属性。 FooBLL类[XmlInclude(typeof(FooResponse))]
,ResponseBLL上的[XmlInclude(typeof(FooBLL))]
等等。
我希望你能帮助我。
答案 0 :(得分:1)
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
使用XmlSerializer
而非typeof(T)
构建其value.GetType()
。来自source code:
protected internal virtual object GetSerializer(Type type, object value, HttpContent content)
{
return GetSerializerForType(type);
}
我们可以看到只有type
(从ObjectContent<T>
传入WriteToStreamAsync()
作为typeof(T)
)用于序列化程序构建。 object value
不是。微软可能已经选择使用value.GetType()
,但没有。然后,序列化程序抛出异常,因为进入的根对象的实际类型(在这种情况下为typeof(Foo)
)与用于构造序列化程序(typeof(object)
)或已知类型之一的类型不同object
。