当我扩展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?
答案 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)。这解决了我的问题。