2013-05-26 139 views
10

XML從API發送有XML文檔中的錯誤(1,2),System.InvalidOperationException:<AuthorizationResult XLMS: 「」>是沒有預料

<AuthenticationResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
<PAPIErrorCode>0</PAPIErrorCode> 
<ErrorMessage/> 
<AccessToken>StringAccessToken</AccessToken> 
<AccessSecret>StringAccessToken</AccessSecret> 
<PolarisUserID>PolarisSampleUser</PolarisUserID> 
<BranchID>7</BranchID> 
<AuthExpDate>2013-05-27T16:57:46.323</AuthExpDate> 
</AuthenticationResult> 

類爲響應

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Xml; 
using System.Xml.Schema; 
using System.Xml.Serialization; 

namespace PAPIAutomatedTestingTool 
{ 
    [XmlRoot(ElementName="AuthorizationResult")] 
    public class AuthorizationResult 
    { 
     public int PAPIErrorCode { get; set; } 

     public string ErrorMessage { get; set; } 

     public string AccessToken { get; set; } 

     public string AccessSecret { get; set; } 

     public int PolarisUserID { get; set; } 

     public int BranchID { get; set; } 

     public DateTime AuthExpDate { get; set; } 
    } 
} 

代碼製作要求和反序列化

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 
using System.Net; 
using System.Web; 
using System.Web.Script.Serialization; 
using System.Security.Cryptography; 
using System.Xml; 
using System.Xml.Serialization; 

namespace PAPIAutomatedTestingTool 
{ 
    public class APICallMethods 
    { 
     public string URI { get; set; } 
     public string accSecret { get; set; } 
     public string accToken { get; set; } 
     public string authorizationString { get; set; } 

     public bool AuthenticateStaffUser() 
     { 
      try 
      { 

      //Initializing all variables 
      string authReqMethod = "POST"; 
      string authAccessKey = "Sample Access Key"; 
      string authAccessKeyID = "Sample Access ID"; 
      string authPatronPassword = ""; 
      DateTime authDateTime = DateTime.Now; 
      string httpAuthDateTime = authDateTime.ToUniversalTime().ToString("r"); 
      string authURI = "Sample URI"; 


      //Composing the papiHash from the given parameters 
      string papiHash = GetPAPIHash(authAccessKey, authReqMethod, authURI, httpAuthDateTime, authPatronPassword); 
      //Formating the authorization string 
      string authorizationString = String.Format("Authorization: PWS {0}:{1}", authAccessKeyID, papiHash); 


      //Creating and defining the WebRequest 
      WebRequest req = WebRequest.Create(authURI); 
      req.Method = "POST"; 
      req.Headers.Add("PolarisDate", httpAuthDateTime); 
      req.Headers.Add(authorizationString); 
      req.ContentType = "application/xml"; 
      string requestBody = "<AuthenticationData><Domain>SampleDomain</Domain><Username>SampleUsername</Username><Password>SamplePassword</Password></AuthenticationData>"; 
      byte[] reqBodyBytes = System.Text.Encoding.UTF8.GetBytes(requestBody); 
      req.ContentLength = reqBodyBytes.Length; 
      using (Stream requestStream = req.GetRequestStream()) 
      { 
       requestStream.Write(reqBodyBytes, 0, reqBodyBytes.Length); 
      } 


      //Receiving the WebResponse 
      using (WebResponse resp = req.GetResponse()) 
      { 
       AuthorizationResult firstResponse = new AuthorizationResult(); 
       Stream respStream = resp.GetResponseStream(); 
       StreamReader sr = new StreamReader(respStream); 


       XmlSerializer xmlSerializer = new XmlSerializer(typeof(AuthorizationResult)); 
       firstResponse = (AuthorizationResult)xmlSerializer.Deserialize(respStream); 
       Console.WriteLine("Authorization: PWS" + firstResponse.AccessSecret + ":" + firstResponse.AccessToken); 
       return true; 
      } 
     } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex); 
       return false; 
      } 

     } 


     public string GetPAPIHash(string strAccessKey, string strHTTPMethod, string strURI, string strHTTPDate, string strPatronPassword) 
     { 
      byte[] secretBytes = UTF8Encoding.UTF8.GetBytes(strAccessKey); 
      HMACSHA1 hmac = new HMACSHA1(secretBytes); 

      byte[] dataBytes = null; 

      if (strPatronPassword.Length > 0) 
      { 
       dataBytes = UTF8Encoding.UTF8.GetBytes(strHTTPMethod + strURI + strHTTPDate + strPatronPassword); 
      } 
      else 
      { 
       dataBytes = UTF8Encoding.UTF8.GetBytes(strHTTPMethod + strURI + strHTTPDate); 
      } 
      byte[] computedHash = hmac.ComputeHash(dataBytes); 
      string computedHashString = Convert.ToBase64String(computedHash); 

      return computedHashString; 
     } 
    } 
} 

我想提出一個POST請求API與包含AuthorizationData身體。 API應該返回xml以反序列化爲firstresponse。我已收到xml(通過打印到控制檯確認),但我收到There is an error in the XML Document(1,2)<AuthorizationData xmlns="">不是預期的。我在這裏先向您的幫助表示感謝。

回答

15

這似乎是抱怨意想不到的根元素,有一些混亂周圍其他地方在你的問題。

在問題的標題,你有<AuthorizationResult>

在示例XML響應你有<AuthenticationResult>

在C#中,您有[XmlRoot(ElementName="AuthorizationResult")]

在你的問題的最後,你提到<AuthorizationData>

這是一個主題的不少變化。

假設XML樣本響應是正確的,你應該改變C#期望根元素是<AuthenticationResult> ...

[XmlRoot(ElementName="AuthenticationResult")] 
public class AuthenticationResult 
{ 
    ... 
+0

我一直面臨着同樣的問題,同樣的錯誤。我的XmlRoot被正確命名,仍然卡住,並說它不能識別xmlns =「...」部分。誰能幫忙? – inthevortex

+0

@inthevortex究竟是什麼錯誤信息? – davmos

+0

即將發生完全相同的錯誤消息,我已通過添加定義其名稱空間及其現在工作的屬性來解決此問題。謝謝 – inthevortex

相關問題