Member 12660024 Ответов: 1

Мое требование состоит в том, чтобы вставить мой ASP.NET данные приложения в tally.


public partial class WebForm1 : System.Web.UI.Page
   {
       private static string RequestXML;
       private static WebRequest TallyRequest;
       protected void Page_Load(object sender, EventArgs e)
       {

       }
       public static DataSet ConnectToTally()
       {
           //try
           //{
               RequestXML = "<ENVELOPE><HEADER><TALLYREQUEST>Export Data</TALLYREQUEST></HEADER><BODY><EXPORTDATA><REQUESTDESC><REPORTNAME>List of Products</REPORTNAME><STATICVARIABLES><SVEXPORTFORMAT>$$SysName:XML</SVEXPORTFORMAT><PRODUCTTYPE>All Inventory Masters</PRODUCTTTYPE></STATICVARIABLES></REQUESTDESC></EXPORTDATA></BODY></ENVELOPE>";
               TallyRequest = WebRequest.Create("http://localhost:9000");
               ((HttpWebRequest)TallyRequest).UserAgent = ".NET Framework Example Client";
               TallyRequest.Method = "Post";
               string postData = RequestXML;
               byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(postData);
               TallyRequest.ContentType = "application/x-www-form-urlencoded";
               TallyRequest.ContentLength = byteArray.Length;
               Stream dataStream = TallyRequest.GetRequestStream();
               dataStream.Write(byteArray, 0, byteArray.Length);
               dataStream.Close();
               WebResponse response = TallyRequest.GetResponse();
               string Response = (((HttpWebResponse)response).StatusDescription).ToString();
               dataStream = response.GetResponseStream();
               StreamReader reader = new StreamReader(dataStream);
               string responseFromTallyServer = reader.ReadToEnd().ToString();
               DataSet TallyResponseDataSet = new DataSet();
               TallyResponseDataSet.ReadXml(new StringReader(responseFromTallyServer));
               reader.Close();
               dataStream.Close();
               response.Close();
               byteArray = null;
               response = null;
               responseFromTallyServer = null;
               Response = null;
               dataStream = null;
               return TallyResponseDataSet;

       }

       protected void btn_Click(object sender, EventArgs e)
       {
           try
           {
               ConnectToTally();
               string xmlstc = string.Empty;
               xmlstc = xmlstc + "<MultipleStockItems=" + "\"" + "All items" + "\" ACTION=" + "\"" + "Create" + "\">";
               xmlstc = "<ENVELOPE>";
               xmlstc = xmlstc + "<HEADER>";
               xmlstc = xmlstc + "<TALLYREQUEST>Export Data</TALLYREQUEST>";
               xmlstc = xmlstc + "</HEADER>";
               xmlstc = xmlstc + "<BODY>";
               xmlstc = xmlstc + "<IMPORTDATA>";
               xmlstc = xmlstc + "<REQUESTDESC>";
               xmlstc = xmlstc + "<REPORTNAME>ListOfProducts</REPORTNAME>";
               xmlstc = xmlstc + "<STATICVARIABLES>";
               xmlstc = xmlstc + "<SVCURRENTCOMPANY>Sphinx</SVCURRENTCOMPANY>";
               xmlstc = xmlstc + "</STATICVARIABLES>";
               xmlstc = xmlstc + "</REQUESTDESC>";

               xmlstc = xmlstc + "<REQUESTDATA>";


             string  item= itm.Text;
             string group = grp.Text;
             string  unit = unt.Text;
            string   quantity = qnt.Text;
            string Rate = rate.Text;
            string msi = "";
               xmlstc = xmlstc + "<TALLYMESSAGE >";
               xmlstc = xmlstc + "<MultipleStockItems=" + "\"" + "All items" + "\" ACTION=" + "\"" + "Create" + "\">";
               xmlstc = xmlstc + "<NameOfItem>" + item + "</NameOfItem>";
               xmlstc = xmlstc + "<under>" + group + "</under>";
               xmlstc = xmlstc + "<units>" + unit + "</units>";
               xmlstc = xmlstc + "<OpeningQuantity>" + quantity + "</OpeningQuantity>";
               xmlstc = xmlstc + "<Rate>" + rate + "</Rate>";
               xmlstc = xmlstc + "<MultipleStockItems>" + msi + "</MultipleStockItems>";


               xmlstc = xmlstc + "</MultipleStockItems>";
               xmlstc = xmlstc + "</TALLYMESSAGE>";
               xmlstc = xmlstc + "</REQUESTDATA>";
               xmlstc = xmlstc + "</IMPORTDATA>";
               xmlstc = xmlstc + "</BODY>";
               xmlstc = xmlstc + "</ENVELOPE>";



               string result = "";


               HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost:9000");
               httpWebRequest.Method = "POST";
               httpWebRequest.ContentLength = xmlstc.Length;
               httpWebRequest.ContentType = "application/x-www-form-urlencoded";
               StreamWriter streamWriter;
               streamWriter = new StreamWriter(httpWebRequest.GetRequestStream());
               streamWriter.Write(xmlstc);
               Response.Write("Data inserted into Tally sucessfully");
               streamWriter.Close();


Что я уже пробовал:

Я попробовал приведенный выше код. Но я не могу хранить данные моего текстового поля в tally. Пожалуйста, помогите мне в этом

1 Ответов

Рейтинг:
1

Richard Deeming

Не используйте конкатенацию строк для создания XML-документа. Если ваши пользователи вводят неожиданные данные, они могут ввести произвольный XML-код в ваш документ. Используйте что-то вроде LINQ to XML[^] вместо.

Ваш XML-документ недействителен - вы не можете присвоить значение атрибута непосредственно имени элемента:

<MultipleStockItems="All items" ACTION="Create">

Чтобы быть допустимым XML, вам понадобится имя атрибута здесь:
<MultipleStockItems SomeAttribute="All items" ACTION="Create">

У вас также есть второй MultipleStockItems элемент, вложенный под внешним MultipleStockItems элемент с пустой строкой в качестве его содержимого. Мне это кажется неправильным - вам нужно будет проверить, как должен выглядеть XML-файл.

Вероятно, вам нужно будет использовать правильный тип контента в вашем веб - запросе-строка XML не является "application/x-www-form-urlencoded" Вам нужно будет проверить код, который получает данные, чтобы увидеть, какой тип контента он ожидает.

И вам нужно будет позвонить httpWebRequest.GetResponse() чтобы на самом деле отправить запрос на сервер.
XDocument xml = new XDocument(
    new XElement("ENVELOPE",
        new XElement("HEADER",
            new XElement("TALLYREQUEST", "Export Data")
        ),
        new XElement("BODY",
            new XElement("IMPORTDATA",
                new XElement("REQUESTDESC",
                    new XElement("REPORTNAME", "ListOfProducts"),
                    new XElement("STATICVARIABLES",
                        new XElement("SVCURRENTCOMPANY", "Sphinx")
                    ) // STATICVARIABLES
                ), // REQUESTDESC
                new XElement("REQUESTDATA",
                    new XElement("TALLYMESSAGE",
                        new XElement("MultipleStockItems",
                            new XAttribute("SomeAttribute", "All items"),
                            new XAttribute("ACTION", "Create"),
                            new XElement("NameOfItem", itm.Text),
                            new XElement("under", grp.Text),
                            new XElement("units", unt.Text),
                            new XElement("OpeningQuantity", qnt.Text),
                            new XElement("Rate", rate.Text),
                            
                            // This one doesn't look right:
                            new XElement("MultipleStockItems", string.Empty) 
                            
                        ) // MultipleStockItems
                    )// TALLYMESSAGE
                ) // REQUESTDATA
            ) // IMPORTDATA
        ) // BODY
    ) // ENVELOPE
);


HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost:9000");
httpWebRequest.Method = "POST";

// TODO: Use the correct content type:
httpWebRequest.ContentType = "application/x-www-form-urlencoded";

using (Stream requestStream = httpWebRequest.GetRequestStream())
{
    xml.Save(requestStream, SaveOptions.DisableFormatting);
}

// Need to actually send the request:
using (WebResponse response = httpWebRequest.GetResponse())
{
}

Response.Write("Data inserted into Tally sucessfully");


Member 12660024

Привет Речард,
Спасибо Вам за ваш ответ. Я написал тип контента как application / xml, но он все равно не работает.

Richard Deeming

"Не работает" - это недостаточно информации, чтобы кто-то мог вам помочь. Вам нужно точно описать проблему, помня, что у нас нет доступа к вашему компьютеру.

Если обработчик, который вы отправляете, не работает, то вам нужно будет проверить, что формат XML, который вы сгенерировали, соответствует формату, который ожидает обработчик. Опять же, это не то, что мы можем сделать для вас, потому что у нас нет доступа к вашей системе.