我已经看到了一些类似的问题,但没有一个解决方案对我有帮助。
当我传递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
}
);
}
}
}
任何人都可以看到我出错的地方吗?
答案 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。