2013-10-01 56 views
1

我已經看到了一些類似的問題,但沒有一個解決方案對我有幫助。Web API發佈XML對象始終爲空

當我通過JSON有效負載時,此代碼完美工作。但是對於XML負載,傳遞給控制器​​POST方法的對象始終爲NULL。

我的控制檯應用程序只是簡單地向我的ASP MVC控制器發出POST http請求,此時傳遞的XML有效負載對象始終爲空。

這是示出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 WebApi Config.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

您是否嘗試過啓動[fiddler](http://fiddler2.com/)並檢查HTTP? – Liam

回答

1

您應該專注於您的業務邏輯,而不是處理網絡請求的所有細節。有一個很好的開源項目叫做ServiceStack,它可以爲你處理所有的基本問題。然後,您只需將發送給您的序列化對象發送到您使用的任何client(s)即可。 Web客戶端只接收處理程序中的業務對象,它並不關心它是如何(以什麼協議)進入的。如果您控制兩端,那麼更好。

例,發佈一個XML對象使用XmlServiceClient

var client = new XmlServiceClient("http://host"); 

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

看到上面的here.您已經註冊了的Hello DTO對象到Web服務的更好的文檔和解釋,它會被路由到基於Name等參數的正確服務。

上例可以配置您的主機,例如:host/hello/{Name},因此您的瀏覽器中輸入的請求可能會包含該url,並且將填入名稱爲Hello的Hello對象將提供給您的Hello Web服務。

0

嘗試從Request.InputStream加載xml,其中將包含原始發佈內容,在本例中爲xml。