2

XmlDocumentをApiControllerに投稿しています(Windowsサービスから、サービスは正常に動作しています、正しく投稿しています、wcf web apiで使用しました)が、xmlは常にnullです、何が間違っていますか?tutotialsなどのクラスを投稿したり、データを取得したりできます。すべて問題ありませんが、XmlDocumentを投稿できません。

public class XmlController : ApiController
{
    public void PostXml(XmlDocument xml)
    {
       // code
    }
}
4

3 に答える 3

2

私は@Rhotによって与えられた解決策に従いますが、どういうわけかそれは機能しないので、私は以下のように編集します。

public class XmlMediaTypeFormatter : MediaTypeFormatter
    {
        public XmlMediaTypeFormatter()
        {
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xml"));
        }

        public override bool CanReadType(Type type)
        {
            return type == typeof(XDocument);
        }

        public override bool CanWriteType(Type type)
        {
            return type == typeof(XDocument);
        }

        public override Task<object> ReadFromStreamAsync(Type type, Stream stream, HttpContent content, IFormatterLogger formatterLogger)
        {
            var reader = new StreamReader(stream);
            string value = reader.ReadToEnd();            

            var tcs = new TaskCompletionSource<object>();
            try
            {
                var xmlDoc = XDocument.Parse(value);
                tcs.SetResult(xmlDoc);
            }
            catch (Exception ex)
            {
                //disable the exception and create custome error
                //tcs.SetException(ex);
                var xml = new XDocument(
                    new XElement("Error",
                        new XElement("Message", "An error has occurred."),
                        new XElement("ExceptionMessage", ex.Message)
                ));

                tcs.SetResult(xml);
            }

            return tcs.Task;
        }

        public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContent content, TransportContext transportContext)
        {
            var writer = new StreamWriter(stream);
            writer.Write(((XDocument)value).ToString());
            writer.Flush();

            var tcs = new TaskCompletionSource<object>();
            tcs.SetResult(null);
            return tcs.Task;
        }              
    }

global.asaxに登録します。

GlobalConfiguration.Configuration.Formatters.Insert(0, new XmlMediaTypeFormatter());

および私のWebAPIコントローラーの下:

public HttpResponseMessage Post(XDocument xml)
        {            
            return Request.CreateResponse(HttpStatusCode.OK, xml);
        }
于 2012-12-05T15:11:02.497 に答える
1

私は解決策を見つけました:

MediaTypeFormatterを継承するには、継承を使用する必要があります

public class XmlMediaTypeFormatter : MediaTypeFormatter
{
    public XmlMediaTypeFormatter()
    {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/xml"));      
    }

    public override System.Threading.Tasks.Task<object> ReadFromStreamAsync(Type type, Stream stream,
         HttpContentHeaders contentHeaders,
         IFormatterLogger formatterLogger)
    {
        var taskCompletionSource = new TaskCompletionSource<object>();
        try
        {
            var memoryStream = new MemoryStream();
            stream.CopyTo(memoryStream);
            var s = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray());

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(s);

            taskCompletionSource.SetResult(xmlDoc);
        }
        catch (Exception e)
        {
            taskCompletionSource.SetException(e);
        }
        return taskCompletionSource.Task;
    }

    public override bool CanReadType(Type type)
    {
        return type == typeof(XmlDocument);
    }

    public override bool CanWriteType(Type type)
    {
        return false;
    }
}

次に、Global.asaxに登録します。

GlobalConfiguration.Configuration.Formatters.Insert(0, new XmlMediaTypeFormatter());

コントローラ:

public HttpResponseMessage PostXml([FromBody] XmlDocument xml)
    {//code...}
于 2012-06-26T12:48:28.677 に答える
0

PostXmlコントローラーでのアクションになるはずですか?その場合は、コントローラーアクションをHttpPostを受け入れるものとしてマークする必要があります。そこから、次のように動作するようにアクションを変更します。

[HttpPost]
public ActionResult PostXml(HttpPostedFileBase xml)
{
    // code
}

それでも投稿されたファイルを受け入れるのに問題がある場合は、デバッガーを起動して、要求ファイルコレクションを調べます:http://msdn.microsoft.com/en-us/library/system.web.httprequest.files.aspx

于 2012-06-21T17:04:42.113 に答える