2

OK、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またはタイプiOSDeviceのtext/xmlで受信するすべてのリクエストが、逆シリアル化にフォーマッターを使用するようになります。

于 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 に答える