Сохранение всех сообщений в .NET WebService в формате XML в БД - PullRequest
0 голосов
/ 01 июня 2010

Я уверен, что это простой вопрос, но я не могу найти решение. Я хочу сохранить файлы XML, опубликованные в моем веб-сервисе .NET. Я уверен, что это простой вызов метода, когда вызывается служба, но я не нахожу его. Я хотел бы сохранить полный XML, размещенный на сервисе

Любая помощь будет принята с благодарностью. Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 01 июня 2010

Спасибо за вашу помощь, однако я нашел то, что искал на http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapextension.aspx

Чтобы помочь кому-то еще новичку в реализации этого через WebService, я включил шаги, которые я выполнил для его реализации, и изменения, чтобы я мог сохранить его в БД, а также в файловую систему. Я выполнил следующие шаги. Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь, и я буду рад ответить.

  1. Создан файл кода в моем проекте веб-сервиса с кодом, указанным в статье
  2. Создано несколько свойств для хранения значений для сохранения в БД

    private string _requestXml;
    private DateTime _start;
    
  3. Затем я изменил метод WriteInput для сохранения значений в этих переменных.

    public void WriteInput(SoapMessage message)
    {
        //Begin Edit
        oldStream.Position = 0;
        _requestXml = new StreamReader(_oldStream).ReadToEnd();
        _start = DateTime.UtcNow;
        //End Edit
        //Begin Original Code
        oldStream.Position = 0;
        Copy(oldStream, newStream);
        var fs = new FileStream(filename, FileMode.Append, FileAccess.Write);
        var w = new StreamWriter(fs);
        var soapString = (message is SoapServerMessage) ? "SoapRequest" : "SoapResponse";
        w.WriteLine("-----" + soapString + " at " + DateTime.Now);
        w.Flush();
        newStream.Position = 0;
        Copy(newStream, fs);
        w.Close();
        newStream.Position = 0;
    }
    
  4. Затем я изменил WriteOutput на

    public void WriteOutput(SoapMessage message)
    {
        //Begin Edit
        var responseXml = new StreamReader(newStream).ReadToEnd();
        newStream.Position = 0;
        //Start process for saving to DB 
        //"_requestXml" = Original Request Soap Message
        //"responseXml" = Service Returned Response
        //"_start" = Request Start Time
        //message.MethodInfo.Name = I save this so I know what method from     
        //message.Url = I save this so I know the original ASMX that was hit
        //End Edit
        //Begin Original Code
        newStream.Position = 0;
        var fs = new FileStream(filename, FileMode.Append, FileAccess.Write);
        var w = new StreamWriter(fs);
        var soapString = (message is SoapServerMessage) ? "SoapResponse" : "SoapRequest";
        w.WriteLine("-----" + soapString + " at " + DateTime.Now);
        w.Flush();
        Copy(newStream, fs);
        w.Close();
        newStream.Position = 0;
        Copy(newStream, oldStream);
    }
    
  5. Теперь все, что осталось, это добавить следующее к вашему сервисному вызову, и вы должны быть в порядке.

    [WebMethod, NameSpace.OfyourTraceExtesionClass.TraceExtension]
    public void WebMethod1()
    {
        //DoSomeStuff
    }
    
0 голосов
/ 20 марта 2015
    [WebMethod]
    public void XMLPersing()
    {
        var XMLDATA = "";

        WriteLogCLS objWriteLog = new WriteLogCLS();
        Stream receiveStream = HttpContext.Current.Request.InputStream;
        receiveStream.Position = 0;
        StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);      //For xml persing..
        XMLDATA = readStream.ReadToEnd();
        readStream.Close();

      objWriteLog.WriteLog(Convert.ToString(XMLDATA));
        XmlTextReader xmlreader = new XmlTextReader(Server.MapPath("Log/Exception/Sample.xml"));
        DataSet ds = new DataSet();
        ds.ReadXml(xmlreader);
        xmlreader.Close();
        if (ds.Tables.Count != 0)
        {
            var strCon = string.Empty;
            strCon = ConfigurationManager.AppSettings["constring"];
            SqlCommand cmdInsertXMLData = new SqlCommand();
            SqlConnection SqlConn;
            SqlConn = new SqlConnection(strCon);
            try
            {
                cmdInsertXMLData = new SqlCommand("usp_InsertXML", SqlConn);
                cmdInsertXMLData.CommandType = CommandType.StoredProcedure;
                // cmdInsertLoginDetails.Parameters.Add("@XMLdata", SqlDbType.Xml).Value = ds.GetXml();
                cmdInsertXMLData.Parameters.AddWithValue("@XMLdata", SqlDbType.Xml);

                if (SqlConn.State == ConnectionState.Closed)
                {
                    SqlConn.Open();
                }
                cmdInsertXMLData.ExecuteNonQuery();
                // response = cmdInsertLoginDetails.Parameters["@Message"].Value.ToString();
            }
            catch (Exception ex)
            {
                objWriteLog.WriteLog("Error on XML Persing : " + ex.Message);
                // response = "Error";
            }
            finally
            {
                if (cmdInsertXMLData != null)
                {
                    cmdInsertXMLData.Dispose();
                }
                if (SqlConn.State == ConnectionState.Open)
                {
                    SqlConn.Close();
                    SqlConn.Dispose();
                }
                objWriteLog = null;
            }
            // return response  ;

        }
    }
}
0 голосов
/ 01 июня 2010
  • XML-файл получен в виде потока
  • Преобразовать поток в байт []
  • Преобразовать байт [] в XDocument (System.Xml.Linq)
  • Чтение XDocument с синтаксисом LINQ и сохранение в БД
0 голосов
/ 01 июня 2010

Если вы хотите регистрировать сообщения http, элегантный способ решить эту проблему - настроить простой обратный прокси-сервер перед вашими веб-службами.В этом прокси у вас будет полный доступ к необработанному HTTP-запросу.

...