Отображение модели файла XML asp.net MVC3 (динамическое сопоставление файла xml с классом модели asp.net mvc3)

Я пытаюсь реализовать платежный шлюз (платежный шлюз INTUIT). Я хотел бы сериализовать xml в класс модели и сохранить в моей базе данных. Я использую настольную модель для интуитивно понятного платежного шлюза, так как размещенная модель очень утомительна для работы, особенно с сертификатами ssl, поэтому я не хочу пробовать это.

Я должен упомянуть, что я могу получить ответ, используя приведенный ниже код, где я застрял в данный момент, это сериализовать xml и сохранить ответ в базе данных. Этот xml извлекается из папки в моей папке xmlfiles, расположенной в моем проекте.

Для примера формата xml ознакомьтесь с этим. https://ipp.developer.intuit.com/0085_QuickBooks_Windows_SDK/qbms/0060_Documentation/Sending_Requests

это XML-файл, который я пытаюсь опубликовать по URL-адресу (https://merchantaccount.ptc.quickbooks.com/j/AppGateway)

<?xml version="1.0"?>
<?qbmsxml version="4.5"?>
<QBMSXML>
    <SignonMsgsRq>
        <SignonDesktopRq>
            <ClientDateTime>2012-07-25T17:13:45</ClientDateTime>
            <ApplicationLogin>abc.abc.us</ApplicationLogin>
            <ConnectionTicket>TGT-1-g42FGaMfOTQ82GcWFBpsuQ</ConnectionTicket>
        </SignonDesktopRq>
    </SignonMsgsRq>
    <QBMSXMLMsgsRq>
        <CustomerCreditCardChargeRq>
            <TransRequestID>4540453787200</TransRequestID>
            <CreditCardNumber>4111111111111111</CreditCardNumber>
            <ExpirationMonth>12</ExpirationMonth>
            <ExpirationYear>2016</ExpirationYear>
            <IsCardPresent>false</IsCardPresent>
            <Amount>10.00</Amount>
        </CustomerCreditCardChargeRq>
    </QBMSXMLMsgsRq>
</QBMSXML>

Контроллер, который я использую для отправки сообщения по URL-адресу

public ActionResult Index()
{
    WebRequest req = null;
    WebResponse rsp = null;
    string fileName = Server.MapPath("~/XMLData/XMLFile1.xml");
    string uri = "https://merchantaccount.ptc.quickbooks.com/j/AppGateway";
    req = WebRequest.Create(uri);
    //req.Proxy = WebProxy.GetDefaultProxy(); // Enable if using proxy
    req.Method = "POST";        // Post method
    req.ContentType = "application/x-qbmsxml";     // content type

    // Wrap the request stream with a text-based writer
    StreamWriter writer = new StreamWriter(req.GetRequestStream());
    // Write the XML text into the stream
    writer.WriteLine(this.GetTextFromXMLFile(fileName));
    writer.Close();
    // Send the data to the webserver
    rsp = req.GetResponse();
   // var resp = (Object)rsp.GetResponseStream();
    if (rsp != null)
    {
        StreamReader inStream = new StreamReader(rsp.GetResponseStream());
        var data = inStream.ReadToEnd();

        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(data);
        string path = Server.MapPath("~/XMLData/SampleXmlE2E.xml");
        xmlDoc.Save(path);//regenerates the xml file in different system.
    }

    return View();
    //XElement root = new XElement("root");
    //root.Add(new XElement("element1"));
    //root.Add(new XElement("element2"));
    //root.Add(new XAttribute("attribute1", "a value"));
    //return new XmlResult(root);
}

private string GetTextFromXMLFile(string file)
{
    StreamReader reader = new StreamReader(file);
    string ret = reader.ReadToEnd();
    reader.Close();
    return ret;
}

private string SendRequest(Uri UriObj, string data)
{
    string _result;

    var request = (HttpWebRequest)WebRequest.Create(UriObj);
    request.Method = "POST";
    request.ContentType = "text/xml";
    var writer = new StreamWriter(request.GetRequestStream());
    writer.Write(data);
    writer.Close();

    var response = (HttpWebResponse)request.GetResponse();

    var streamResponse = response.GetResponseStream();
    var streamRead = new StreamReader(streamResponse);

    _result = streamRead.ReadToEnd().Trim();
    streamRead.Close();
    streamResponse.Close();
    response.Close();
    return _result;
}

Любая помощь будет оценена по достоинству. Спасибо


person Varun Maggo    schedule 01.08.2012    source источник


Ответы (1)


Варун,

[Изменить -обновить]

На основе этого XML:

<?qbmsxml version="4.5"?>
<QBMSXML>
  <SignonMsgsRq>
    <SignonDesktopRq>
      <ClientDateTime>2012-07-25T17:13:45</ClientDateTime>
      <ApplicationLogin>app.app.login.url</ApplicationLogin>
      <ConnectionTicket>TGT-1-g42FGaMfOTQ82GcWFBpsuQ</ConnectionTicket>
    </SignonDesktopRq>
  </SignonMsgsRq>
  <QBMSXMLMsgsRq>
    <CustomerCreditCardChargeRq>
      <TransRequestID>4540453787200</TransRequestID>
      <CreditCardNumber>4111111111111111</CreditCardNumber>
      <ExpirationMonth>12</ExpirationMonth>
      <ExpirationYear>2016</ExpirationYear>
      <IsCardPresent>false</IsCardPresent>
      <Amount>10.00</Amount>
    </CustomerCreditCardChargeRq>
  </QBMSXMLMsgsRq>
</QBMSXML>

Вот структура класса, которую вам нужно десериализовать в соответствии с приведенным выше примером:

[XmlRoot("QBMSXML")]
public class QbmsXml
{
    [XmlElement("SignonMsgsRq")]
    public SignonMsgsRq SignonMsgsRq { get; set; }

    [XmlElement("QBMSXMLMsgsRq")]
    public QbmsXmlMsgsRq QbmsXmlMsgsRq { get; set; }
}

public class SignonMsgsRq
{
    [XmlElement("SignonDesktopRq")]
    public SignonDesktopRq SignonDesktopRq { get; set; }
}

public class SignonDesktopRq
{
    [XmlElement("ClientDateTime")]
    public DateTime ClientDateTime { get; set; }

    [XmlElement("ApplicationLogin")]
    public string ApplicationLogin { get; set; }

    [XmlElement("ConnectionTicket")]
    public string ConnectionTicket { get; set; }
}

public class QbmsXmlMsgsRq
{
    [XmlElement("CustomerCreditCardChargeRq")]
    public CustomerCreditCardChargeRq CustomerCreditCardChargeRq { get; set; }
}

public class CustomerCreditCardChargeRq
{
    [XmlElement("TransRequestID")]
    public Int64 TransRequestID { get; set; }

    [XmlElement("CreditCardNumber")]
    public string CreditCardNumber { get; set; }

    [XmlElement("ExpirationMonth")]
    public int ExpirationMonth { get; set; }

    [XmlElement("ExpirationYear")]
    public int ExpirationYear { get; set; }

    [XmlElement("IsCardPresent")]
    public bool IsCardPresent { get; set; }

    [XmlElement("Amount")]
    public double Amount { get; set; }
}

Просто используйте xmlSerialiser по строкам:

class Program
{
    private static T DeSerialize<T>(string fromXmlFile) where T: class
    {
        if (!File.Exists(fromXmlFile))
        {
            return default(T);
        }
        T deserializedClass;
        var serializer = new XmlSerializer(typeof(T));

        // ToDo: add error catching etc
        using (var reader = new StreamReader(fromXmlFile))
        {
            deserializedClass = (T)serializer.Deserialize(reader);
        }
        return deserializedClass;
    }

    static void Main(string[] args)
    {
        var yourXmlFilePath = @"d:\temp\xmltest.xml";
        var deserializedClass = DeSerialize<QbmsXml>(yourXmlFilePath);

        Console.WriteLine(deserializedClass
                            .QbmsXmlMsgsRq
                            .CustomerCreditCardChargeRq.Amount);
        Console.Read();
    }
}

надеюсь это поможет.

person jim tollan    schedule 01.08.2012
comment
Он запускается, но всегда возвращает ноль, я убедился, что имя файла выбрано, и он загружает xml. - person Varun Maggo; 01.08.2012
comment
public ViewResult Index() { var yourXmlFilePath = Server.MapPath(~/XMLData/XMLFile1.xml); var deserializedClass = DeSerialize‹QbmsXml›(yourXmlFilePath); вернуть вид(); } - person Varun Maggo; 01.08.2012
comment
varun, в методе xml DeSerialize что происходит внутри используемого блока?? Кроме того, попробуйте создать простое консольное приложение и скопировать код из моего ответа и посмотреть, что там тоже происходит. Наконец, вы понимаете, что ничего не передаете в представление индекса. ваше возвращаемое значение должно быть return View(deserializedClass);, а ваш Index.cshtml должен иметь модель, определенную для типа QbmsXml, то есть @model yournamespace.Models.QbmsXml - person jim tollan; 01.08.2012
comment
По какой-то причине он все еще дает мне нулевые значения. Я только что запустил ваш проект с помощью консольного приложения. Смотрите это скриншот. ‹www.ibistage.com/nullvalues.jpg› - person Varun Maggo; 01.08.2012
comment
Также это файл модели класса ‹www.ibistage.com/qbmsmodel.jpg› спасибо за ваше время. - person Varun Maggo; 01.08.2012
comment
varun - можете ли вы подтвердить, что XMLFile1.xml такой же, как тот, который вы разместили в своем вопросе, поскольку это то, на чем я основывал свою запись xml. если нет, перетащите содержимое этого файла в вопрос, и я обновлю объектную модель для этого как можно скорее. - person jim tollan; 01.08.2012
comment
Варун, это безумие :-). Я попробовал это, скопировав свой собственный ответ (плюс раздел xml) на свой ноутбук и создав новый проект с XML, сохраненным в файле. все заработало как и планировалось. Я не могу понять, в чем может быть дело. можете ли вы «отправить» мне свой фактический файл xmlfile1.xml (мой адрес электронной почты указан в моем профиле) на случай, если между ними есть какие-то тонкие различия, и я могу проверить это локально? - person jim tollan; 01.08.2012
comment
Кажется, я потерялся! ‹www.ibistage.com/qbms.zip› - person Varun Maggo; 01.08.2012
comment
варун - спасибо за зип. к сожалению, xmlfile1.xml не включен. можете ли вы переделать это с тем, что прилагается, и я все исправлю по мере необходимости и / или сделаю комментарии о том, что вам нужно сделать - person jim tollan; 01.08.2012
comment
Джим, XML-файл, о котором я упоминал в вопросе, это тот же файл, что и на моем диске c. Спасибо. - person Varun Maggo; 01.08.2012
comment
привет варун, фактический файл xml, который вы пытаетесь использовать, «может» иметь что-то немного отличное от того, что в примере, поэтому моя просьба вставить это в ссылку / zip - person jim tollan; 01.08.2012
comment
эй варун, этот формат файла отличается от того, что в вашем вопросе!! я буду обновлять по мере необходимости - person jim tollan; 01.08.2012
comment
Я удивлен, как это может выдать нулевое значение, я тоже пробовал на своем конце. он должен выдать ошибку времени выполнения! если схема xml соответствует модели класса, она должна вызывать либо ошибку времени компиляции, либо ошибку времени выполнения. - person Varun Maggo; 01.08.2012
comment
varun - см. обновление в моем ответе для класса на основе вашего нового xmlfile - person jim tollan; 01.08.2012