web-dev-qa-db-ja.com

XMLドキュメント(1,2)にエラーがあります。System.InvalidOperationException:<AuthorizationResult xlms: "">は予期されていませんでした

APIから送信されたXML

_<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 AuthorizationDataを含む本文を使用してAPIにリクエストします。APIはXMLを返し、firstresponseにデシリアライズします。しかし、私はThere is an error in the XML Document(1,2)を受け取り、_<AuthorizationData xmlns="">_は予期されていませんでした。

12
hfrog713

予期しないルート要素について不平を言っているようで、質問の他の場所でそれを取り巻く混乱があります。

質問のタイトルには_<AuthorizationResult>_があります

XML応答の例では、_<AuthenticationResult>_があります

C#には[XmlRoot(ElementName="AuthorizationResult")]があります

あなたの質問の終わりにあなたは_<AuthorizationData>_に言及します

これは、テーマに関するかなり微妙なバリエーションです。

XMLサンプルの応答が正しいと仮定すると、ルート要素が_<AuthenticationResult>_...になるようにC#を変更する必要があります。

_[XmlRoot(ElementName="AuthenticationResult")]
public class AuthenticationResult
{
    ...
_
17
davmos