C# 将所有到.NET WebService的帖子以XML格式保存到DB
我相信这是一个简单的问题,但我没有找到解决办法。我想保存发布到.NETWeb服务的XML文件。我确信当调用服务时,它只是一个简单的方法调用,但我没有找到它。我想保存发布到服务的完整XMLC# 将所有到.NET WebService的帖子以XML格式保存到DB,c#,web-services,asmx,C#,Web Services,Asmx,我相信这是一个简单的问题,但我没有找到解决办法。我想保存发布到.NETWeb服务的XML文件。我确信当调用服务时,它只是一个简单的方法调用,但我没有找到它。我想保存发布到服务的完整XML 任何帮助都将不胜感激。提前谢谢。如果您想记录http post消息,一种优雅的解决方法是在web服务前面设置一个简单的反向代理。在此代理中,您可以完全访问原始http请求。 XML文件作为流接收 将流转换为字节[] 将字节[]转换为XDocument(System.Xml.Linq) 使用LINQ语法读取XDo
任何帮助都将不胜感激。提前谢谢。如果您想记录http post消息,一种优雅的解决方法是在web服务前面设置一个简单的反向代理。在此代理中,您可以完全访问原始http请求。
- XML文件作为流接收
- 将流转换为字节[]
- 将字节[]转换为XDocument(System.Xml.Linq)
- 使用LINQ语法读取XDocument并保存到DB
- 使用本文中列出的代码在我的web服务项目中创建了一个代码文件
- 创建了一些属性来存储要保存到数据库的值
private string _requestXml; private DateTime _start;
- 然后我修改了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; }
- 然后我将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); }
- 现在只需在服务电话中添加以下内容,您就可以开始了
[WebMethod, NameSpace.OfyourTraceExtesionClass.TraceExtension] public void WebMethod1() { //DoSomeStuff }
- 谢谢你的帮助,不过我找到了我想要的东西
为了帮助其他新加入tring的人通过WebService实现这一点,我包括了我为实现它而执行的步骤和修改,以便我可以将它保存到db以及执行以下步骤的文件系统。如果您有任何问题,请随时向aks咨询,我很乐意回答
这个问题太宽泛了,无法回答。您可以更具体一点吗?您需要指定您使用的是传统的ASMX web服务,而不是WCF服务。
[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 ;
}
}
}