抛出IOperationBehavior中使用的新WebFaultException不起作用

时间:2015-10-15 15:47:56

标签: c# wcf http-status-code-403

当我扩展Attribute,IOperationBehavior,IParameterInspector并且它不起作用时,我抛出WebFaultException。

public class ApplicationNotSupportedAttribute : Attribute, IOperationBehavior, IParameterInspector
    {

        private readonly ApplicationNotSupportedBehaviour behaviour;

        public ApplicationNotSupportedAttribute()
        {
            Logging<string>.Error("ApplicationNotSupportedAttribute");
            behaviour = new ApplicationNotSupportedBehaviour();
        }

        public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {
            behaviour.AddBindingParameters(operationDescription, bindingParameters);
        }

        public void ApplyClientBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.ClientOperation clientOperation)
        {
            behaviour.ApplyClientBehavior(operationDescription, clientOperation);
        }

        public void ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation)
        {
            behaviour.ApplyDispatchBehavior(operationDescription, dispatchOperation);
        }

        public void Validate(OperationDescription operationDescription)
        {
            behaviour.Validate(operationDescription);
        }

        public object BeforeCall(string operationName, object[] inputs)
        {
            throw new WebFaultException(HttpStatusCode.Forbidden);
        }
        public void AfterCall(string operationName, object[] outputs,
                           object returnValue, object correlationState)
        {
        }

然后我有了服务:

[WebInvoke(Method = "POST", UriTemplate = "myMethod", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        [ApplicationNotSupportedAttribute]
        myMethodResult myMethod(MyMethodRequest myMethodRequest);

从上面运行代码后,我得到200 Ok。如果我添加

  throw new WebFaultException(HttpStatusCode.Forbidden);

在myMethod我得到了403 Forbidden。如下面的代码:

public myMethodResult myMethod(MyMethodRequest myMethodRequest)
        {
            throw new WebFaultException<myObject>(myObj, HttpStatusCode.Forbidden);
        }

在我们真正进入myMethod之前,以某种方式可以获得403?

1 个答案:

答案 0 :(得分:0)

我发现ApplicationNotSupportedAttribute类中的问题除了BeforeCall和ApplyDispatchBehavior之外,所有覆盖的方法都可能是空的,如下所示:

public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
        {
            dispatchOperation.ParameterInspectors.Add(this);
        }

        public object BeforeCall(string operationName, object[] inputs)
        {
            WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Forbidden;
            throw new WebFaultException<string>("Unauthorized", HttpStatusCode.Forbidden);
        }

似乎我错过了dispatchOperation.ParameterInspectors.Add(this)。这解决了我的问题。