我有一個SoapExtension。它記錄我所有的web服務請求和響應。我認爲項目中有超過一千個webservice調用。我的問題是我無法登錄請求,如果我的web服務調用結束超時或httpexceptions如403,404。我也需要記錄這些例外情況。如何處理SoapExtension中的超時異常
這是我的SoapExtension
public class SoapLogger : SoapExtension
{
Stream orgStream;
Stream newStream;
LogItem logItem;
// When the SOAP extension is accessed for the first time, the XML Web
// service method it is applied to is accessed to store the file
// name passed in, using the corresponding SoapExtensionAttribute.
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{
return 0;
}
// The SOAP extension was configured to run using a configuration file
// instead of an attribute applied to a specific XML Web service
// method.
public override object GetInitializer(Type WebServiceType)
{
return 0;
}
// Receive the file name stored by GetInitializer and store it in a
// member variable for this specific instance.
public override void Initialize(object initializer)
{
logItem = new LogItem();
}
// Save the Stream representing the SOAP request or SOAP response into
// a local memory buffer.
public override Stream ChainStream(Stream stream)
{
orgStream = stream;
newStream = new MemoryStream();
return newStream;
}
// If the SoapMessageStage is such that the SoapRequest or
// SoapResponse is still in the SOAP format to be sent or received,
// save it out to a file.
public override void ProcessMessage(SoapMessage message)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeSerialize:
break;
case SoapMessageStage.AfterSerialize:
WriteOutput();
break;
case SoapMessageStage.BeforeDeserialize:
WriteInput(message);
break;
case SoapMessageStage.AfterDeserialize:
CheckException(message);
break;
default:
throw new Exception("invalid soap stage");
}
}
public void CheckException(SoapMessage message)
{
logItem.WebClassName = message.MethodInfo.DeclaringType.FullName;
logItem.WebMethodName = message.MethodInfo.Name;
MethodBase method = FindMethod(logItem.WebMethodName);
logItem.MethodName = method != null ? method.Name : "";
logItem.ClassName = method != null ? method.DeclaringType.Name : "";
logItem.Exception = message.Exception != null ? message.Exception.Message : "";
LogToDB(logItem);
}
MethodBase FindMethod(string webMethodName)
{
try
{
StackFrame[] stackFrames = new StackTrace().GetFrames();
int i;
for (i = 0; i < stackFrames.Length; i++)
{
if (stackFrames[i].GetMethod().Name == webMethodName) break;
}
return i < stackFrames.Length - 1 ? stackFrames[i + 1].GetMethod() : null;
}
catch
{
return null;
}
}
void LogToDB(LogItem logItem)
{
// I am logging logItem to db
}
public void WriteOutput()
{
newStream.Position = 0;
logItem.Request = CopyString(newStream);
logItem.StartTime = DateTime.Now;
newStream.Position = 0;
Copy(newStream, orgStream);
newStream.Position = 0;
}
public void WriteInput(SoapMessage message)
{
Copy(orgStream, newStream);
newStream.Position = 0;
logItem.Response = CopyString(newStream);
logItem.EndTime = DateTime.Now;
newStream.Position = 0;
}
void Copy(Stream from, Stream to)
{
TextReader reader = new StreamReader(from);
TextWriter writer = new StreamWriter(to);
writer.WriteLine(reader.ReadToEnd());
writer.Flush();
}
string CopyString(Stream from)
{
TextReader reader = new StreamReader(from);
return reader.ReadToEnd();
}
}
ASMX是一種過時的技術,並且不應該被用於新的開發WCF應該用於Web服務客戶端和服務器的所有新開發。一個提示:微軟已經退役了[ASMX Forum](http://social.msdn.microsoft.com/Forums/en-US/asmxandxml/threads)在其他方面,WCF給你一個比ASMX更好的日誌記錄故事。 – 2013-03-05 14:49:52