2010-06-01 37 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 ; 

     } 
    } 
}