Web API POSTing XML对象始终为null

时间:2013-10-01 13:31:25

标签: c# xml rest asp.net-web-api

我已经看到了一些类似的问题,但没有一个解决方案对我有帮助。

当我传递JSON有效负载时,此代码非常有效。但是对于XML加载,传递给控制器​​POST方法的对象始终为NULL。

我的控制台应用程序只是向我的ASP MVC控制器发出POST http请求,此时传递的XML有效内容对象始终为null。

这是我的控制台应用程序,显示正在设置的http请求对象和正在构造的XML Xdocument有效负载:

    XDocument doc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
    XElement clientRequestElement = new XElement(xmlns + "PLTSActivation",
            new XAttribute(XNamespace.Xmlns + "xsi", xsi),
            new XElement(xmlns + "iSIClientID", iid.ToString()),
            new XElement(xmlns + "organizationId", ooid),
            new XElement(xmlns + "statusDescription", "Success"));

    doc.Add(clientRequestElement);

    return doc.ToString(SaveOptions.DisableFormatting);
}


public static void PostXML()
{
    string _URL = "http://localhost:24689/api/PTShandler/postxml";

    string _OOID = "TEST";
    string convertedJSONPayload = "";

    var payloadObj = new
    {
        XmlPayload = ConstructProvisioningRequest(99783971, _OOID)
    };

    try
    {
        var httpWebRequest = (HttpWebRequest)WebRequest.Create(_URL);
                httpWebRequest.Headers.Add("ORGOID", _OOID);
                httpWebRequest.Headers.Add("Culture", "en-US");
                httpWebRequest.ContentType = "application/xml";
                httpWebRequest.Accept = "application/xml";
                httpWebRequest.Method = "POST";


        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            streamWriter.Write(payloadObj.ToString());
            streamWriter.Flush();
            streamWriter.Close();
        }
    }

这是我的PTShandler控制器,显示了POST方法:

[System.Web.Mvc.HttpPost]
public string PostXML(object xmlPayload)
{

    //*****The 'xmlPayLoad' object is always null*****
    List<SplitXML> returnedPopulatedXMLObject = SetXMLstrings(XDocument.Parse(xmlPayload.ToString()));

    foreach (var XMLitem in returnedPopulatedXMLObject)
    {
        _ClientID = XMLitem.ISIClientID;

        _OrganizationID = XMLitem.OrganizationID;

        _Status = XMLitem.Status;
    }

    string stringXDoc;

    return stringXDoc = "POSTed";
}

这是我的Global.asax.cs文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace RESTful.CallBackService
{
public class WebApiApplication : System.Web.HttpApplication
{
        protected void Application_Start()
        {
            var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter;
            xml.UseXmlSerializer = true;

            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);  
        }
}
}

这是我的App_Start WebApiConfig.cs文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Xml.Serialization;

namespace RESTful.CallBackService
{
public static class WebApiConfig
{
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new
            {
                id = RouteParameter.Optional
            }
        );
        }
}
}

任何人都可以看到我出错的地方吗?

2 个答案:

答案 0 :(得分:1)

您应该专注于业务逻辑,而不是处理Web请求的所有细节。有一个很好的开源项目叫ServiceStack,它将为你处理所有的细节。然后,您只需将为您序列化的对象发送到您使用的任何client(s)。 Web客户端只接收处理程序中的业务对象,它不关心它到达的方式(使用什么协议)。如果你控制两端,那就更好了。

示例,要发布使用XmlServiceClient

的XML对象
var client = new XmlServiceClient("http://host");

HelloResponse response = client.Post(new Hello { Name = "World" });

请参阅上述here.的更好文档和说明。您已将Hello DTO对象注册到Web服务,它将根据Name等参数路由到正确的服务。 / p>

对于上面的示例,您的主机可以配置为:host/hello/{Name},因此只需在浏览器中输入的请求可以包含该URL,并且填充了Name的Hello对象将被提供给您的Hello Web-服务。

答案 1 :(得分:0)

尝试从Request.InputStream加载xml,其中包含原始帖子内容,在本例中为xml。