在WCF中记录请求和响应

时间:2016-06-19 06:05:30

标签: c# wcf

我想了解是否有更好的方法可以使用WCF以自定义方式进行日志记录或错误处理

以下是该方案。 我有以下服务

namespace IntegrationServices.Contract.SomeServices
{
    [ServiceContract(Name = "SomeServices")]
    public interface ISomeService
    {
        //Having 30+ contracts below is one of them

        [OperationContract]
        [WebInvoke(UriTemplate = "/GetOnlineSomething")]
        SomeTransactionResponse GetOnlineSomething(string someNumber);
    }
}

由calss

实现
namespace IntegrationServices.Service.PaymentServices
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    [GlobalErrorBehaviorAttribute(typeof(GlobalErrorHandler), Project.Name)]
    public class PaymentService : ISomeService
    {
    public OnlinePaymentTransactionResponse GetOnlinePaymentTransaction(string someNumber)
        {
            //we have authentication code here which is OK
            //Logging the request
            _transactionKey = Guid.NewGuid();
            TransactionRequest(/*some message and some parameter*/);            

            try
            {
                //do something
            }
            catch (Exception ex)
            {
                LogHelper.WriteErrorLogAsync(/*logging some more information*/);
                response.ErrorMessage = Project.PHAPICommonErrorMessage;
            }

            //Logging the response
            TransactionResponse(/*some parameter and error message from catch block*/);

            return response;
        }
    }
}

记录功能如下

private void TransactionRequest(string xmlObject, Guid? groupKey, string name)
        {
            //writing to DB 
        }
private void TransactionResponse(string xmlObject, Guid? groupKey, string name)
        {
            //writing to DB 
        }

现在我的问题是,我必须在所有30多个函数中编写日志请求和响应,如上所述。 任何人都可以帮助我如何改进以上或需要重新设计整个方法。

1 个答案:

答案 0 :(得分:0)

使用PostSharp登录我的代码库,我取得了很大的成功。在WCF的上下文中,它类似于Aleksey L建议的IServiceBehavior方法,它为您提供了在方法执行之前和之后执行的“挂钩”,您可以在其中添加日志记录。这样做的好处在于您还可以在WCF调用的上下文之外使用PostSharp日志记录属性。