我有一個使用多種方法的WCF服務。我想記錄來自客戶端的原始請求,而不管它是如何發送的。一種方法接受數據作爲查詢字符串(嚴格的傳統支持),我可以使用日誌:如何在WCF服務中記錄原始請求
OperationContext.Current.IncomingMessageHeaders.To.AbsoluteUri
足以在該方案中,但其他方法允許客戶端使用生成的代理類來發送數據作爲XML由svcutil.exe。在這種情況下,我發現我希望在S中的數據:主體:
OperationContext.Current.RequestContext.RequestMessage
不幸的是,無論我怎麼努力讀之前,我無法創建消息的緩衝副本。這裏有一個例子:
public CascadeResponse SendCustomer(Customer c)
{
Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage();
LogMessage(msg);
// Now that the request is logged, get on with the rest
}
在SendCustomer的第一線,不過,我得到以下錯誤:
,因爲它已經被閱讀了此消息不支持操作。
這是我創造緩衝副本的重點,當然?我猜測我在這裏做了一些根本性錯誤。
編輯:
好了,所以該方法現在是這樣的:
public CascadeResponse SendCustomer(Message requestMessage)
{
Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage();
LogMessage(msg);
// Now that the request is logged, get on with the rest
Customer c = msg.GetBody<Customer>();
string clientKey = "1111"; // This should be the clientKey string passed to the function along with the customer
return SendLead(c, clientKey);
}
我的問題是,我不知道如何讓客戶和ClientKey派作爲獨立的實體。我可以讓clientKey成爲Customer的一個屬性(或者創建一個專門用於傳遞數據的自定義對象,並且包含Customer和ClientKey作爲屬性),但是如果可能的話,我想避免這種情況,因爲這是一個遺留系統的升級,已經以這種方式工作。
我也有麻煩使用svcUtil.exe來創建我的代理類 - 我假設有上述方法簽名意味着我的服務將不再公佈正確的簽名發送請求爲?不確定是否足夠清楚 - 如果我的唯一輸入法接受一個Message對象,我的客戶如何知道發送一個Customer和一個ClientKey?
你爲什麼不能在WCF中使用內置跟蹤功能的任何原因? http://msdn.microsoft.com/en-us/library/ms733025.aspx – DaveRead 2012-04-20 15:40:06
@DaveRead主要是我不知道它 - 這是否允許我將我的日誌保存到數據庫? – Maloric 2012-04-23 10:18:15
不是開箱即用,但您可以創建自己的自定義TraceListener,請參閱此文章的詳細信息:http://msdn.microsoft.com/en-gb/magazine/cc300790.aspx – DaveRead 2012-04-23 12:04:22