2010-06-01 103 views
0

我相信这是一个简单的问题,但我找不到解决方案。我想保存发布到我的.NET Web服务的XML文件。我相信这只是一个简单的方法调用时调用服务,但我没有找到它。我想保存完整的XML发布到服务将所有帖子保存为XML到XML数据库

任何帮助将不胜感激。先谢谢你。

+0

问题太广泛无法回答。你可以说得更详细点吗? – 2010-06-01 02:29:47

+0

您需要指定您使用的是旧版ASMX Web服务,而不是WCF服务。 – 2010-06-01 16:37:08

回答

2

感谢你的帮助,但是我发现我一直在寻找在http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapextension.aspx

为了帮助别人,我这是我通过WebService实现的新内容,包括我为实现它和修改所执行的步骤,以便将它保存到数据库以及我执行以下步骤的文件系统中。如果您有任何问题,请随时咨询,我会很乐意回答。

  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 
    } 
    
0

如果您想记录http发布消息,解决这个问题的一个优雅方法是在Web服务前设置一个简单的反向代理。在这个代理中,你可以完全访问原始的http请求。

0
  • XML文件接收作为流
  • 流转换为byte []
  • 转换字节[]到的XDocument(System.Xml.Linq的)
  • 读取的XDocument与LINQ语法和保存到DB
0
[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 ; 

     } 
    } 
}