代码之家  ›  专栏  ›  技术社区  ›  Nic

将所有日志以XML格式保存到.NET WebService数据库

  •  0
  • Nic  · 技术社区  · 14 年前

    我相信这是一个简单的问题,但我没有找到解决办法。我想保存发布到.NET Web服务的XML文件。我确信在调用服务时,它只是一个简单的方法调用,但我找不到它。我想保存发布到服务的完整XML

    任何帮助都将不胜感激。提前谢谢。

    4 回复  |  直到 9 年前
        1
  •  2
  •   Nic    14 年前

    谢谢你的帮助,不过我找到了我想要的 http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapextension.aspx

    为了帮助任何其他对tring不熟悉的人通过WebService来实现这一点,我包括了我为实现它所执行的步骤和修改,这样我就可以将它保存到数据库以及执行以下步骤的文件系统中。如果您有任何问题,请随时与AKS联系,我很乐意回答。

    1. 在我的Web服务项目中创建了一个代码文件,其中包含本文中列出的代码。
    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
      }
      
        2
  •  0
  •   k_b    14 年前

    如果您想记录HTTP Post消息,一个很好的解决方法是在Web服务前面设置一个简单的反向代理。在这个代理中,您可以完全访问原始HTTP请求。

        3
  •  0
  •   Jeaf Gilbert    14 年前
    • XML文件作为流接收
    • 将流转换为字节[]
    • 将byte[]转换为xdocument(system.xml.linq)
    • 用linq语法读取xdocument并保存到db
        4
  •  0
  •   Abhisek Das    9 年前
        [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  ;
    
            }
        }
    }