2

好的,所以我有一个 MediaTypeFormatter:

public class iOSDeviceXmlFormatter : BufferedMediaTypeFormatter
{
    public iOSDeviceXmlFormatter() {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/xml"));
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xml"));
    }
    public override bool CanReadType(Type type) {
        if (type == typeof(iOSDevice)) {
            return true;
        }
        return false;
    }

    public override object ReadFromStream(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger) {
        iOSDevice device = null;
        using (XmlReader reader = XmlReader.Create(readStream)) {
            if (reader.ReadToFollowing("iOSDevice")) {
                if (!reader.IsEmptyElement) {
                    device = new iOSDevice();
                    ... do processing here ...
                }
            }
        }
        readStream.Close();
        return device;
    }

我有这个动作来处理 PUT:

    public void Put(string id, iOSDevice model)
    {
    }

我也试过这个:

    public void Put(string id, [FromBody]iOSDevice model)
    {
    }

我试过这个:

    public void Put(string id, [FromBody]string value)
    {
    }

当我这样做时,这些都不起作用:

string data = "<iOSDevice>xml_goes_here</iOSDevice>";
WebClient client = new WebClient();
client.UploadString(url, "PUT", data);

该操作拒绝触发我的 iOSDeviceXmlFormatter,它甚至不会将其读取为 [FromBody] 字符串。你怎么得到这个东西的地图?

谢谢,

艾莉森

4

2 回答 2

2

你是如何注册你的格式化程序的?您需要在第一个位置注册此格式化程序,以便它优先于 WebAPI 的默认格式化程序。代码如下所示:

config.Formatters.Insert(0, new iOSDeviceXmlFormatter());

这应该确保任何带有内容类型 application/xml 或 text/xml 类型 iOSDevice 的请求都使用您的格式化程序进行反序列化。

于 2013-01-07T21:46:02.900 回答
2

您已指定将为以下请求Content-Type标头触发格式化程序:

SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/xml"));
SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xml"));

但是您还没有在请求中设置它们。这就是为什么您的自定义格式化程序永远不会被触发的原因。因此,一旦您在全局配置中注册它:

config.Formatters.Insert(0, new iOSDeviceXmlFormatter());

您应该确保设置正确的请求Content-Type标头:

string data = "<iOSDevice>xml_goes_here</iOSDevice>";
using (WebClient client = new WebClient())
{
    // That's the important part that you are missing in your request
    client.Headers[HttpRequestHeader.ContentType] = "text/xml";
    var result = client.UploadString(url, "PUT", data);
}

现在将触发以下操作:

public void Put(string id, iOSDevice model)
{
}

当然,您的自定义格式化程序将在之前被调用,以便iOSDevice从请求中实例化您。

于 2013-01-07T21:55:46.763 回答