2013-05-26 17 views
10

XML wysyłane z APIWystępuje błąd w dokumencie XML (1,2), System.InvalidOperationException: <AuthorizationResult xlms: ""> nie spodziewano

<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> 

Ćwiczenia na odpowiedź

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; } 
    } 
} 

Kod dokonywania żądanie i deserializacji

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; 
     } 
    } 
} 

Wysyłam żądanie POST do interfejsu API z treścią zawierającą dane AuthorizationData. API ma zwrócić xml do deserializacji do pierwszej odpowiedzi. Otrzymałem xml (potwierdzony przez drukowanie na konsolę), ale otrzymuję There is an error in the XML Document(1,2) i nie oczekiwano <AuthorizationData xmlns="">. Dzięki za pomoc z góry.

Odpowiedz

15

Wygląda na to, że skarżysz się na nieoczekiwany element główny i istnieje pewne zamieszanie związane z tym w innym miejscu twojego pytania.

W tytule zapytania masz <AuthorizationResult>

w odpowiedzi przykład XML masz <AuthenticationResult>

W języku C# trzeba [XmlRoot(ElementName="AuthorizationResult")]

Pod koniec pytanie wspomnieć <AuthorizationData>

To kilka subtelnych wariacji na temat.

Zakładając odpowiedź próbki XML jest poprawna, należy zmienić C# oczekiwać element główny być <AuthenticationResult> ...

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

I zostały stoi ten sam problem, ten sam błąd. Mój XmlRoot jest poprawnie nazwany i nadal utknie i mówi, że nie może zidentyfikować części xmlns = "...". Czy ktoś może pomóc? – inthevortex

+0

@inthevortex Jaki dokładnie jest twój komunikat o błędzie? – davmos

+0

dokładnie ten sam komunikat o błędzie, rozwiązałem go, dodając atrybut, który definiuje jego przestrzeń nazw i działa. Dzięki – inthevortex