【问题标题】:Throw new WebFaultException used in IOperationBehavior does not work抛出 IOperationBehavior 中使用的新 WebFaultException 不起作用
【发布时间】:2015-10-15 15:47:56
【问题描述】:

我在扩展 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 吗?

【问题讨论】:

  • 您尝试过 IOperationInvoker 的运气吗?在那里你可以做一些之前和之后的事情。
  • 我试过了,但没有结果:|
  • 您必须使用 ActionFilterAttribute(不是 Attribute)来创建您的 Attribute,在 OnActionExecuting 方法中调用 throw

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


【解决方案1】:

我在 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)。这解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-25
    • 2017-01-14
    • 1970-01-01
    • 2021-04-16
    • 2012-08-01
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多