IServiceBehavior :防止对某些消息应用消息检查器
IServiceBehavior : prevent applying Message inspectors for some messages
在 WCF 服务上,我添加了一个属性 [WebAppServiceBehavior],它检查服务消息中的某些 headers 的真实性。
我是否可以在某些可以忽略这些检查的特定方法上使用其他属性。
我的问题是我在一个服务中有 20 个方法,我只想从该检查中排除 2 个方法。
[WebAppServiceBehavior]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class SyncService : ISyncService
{
public void DoWork() //check here
{
}
public void DoWork2()//ignore here
{
}
}
public class WebAppServiceBehavior : Attribute, IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
// throw new NotImplementedException();
foreach (ChannelDispatcher ch in serviceHostBase.ChannelDispatchers)
{
foreach (var endptDispatcher in ch.Endpoints)
{
endptDispatcher.DispatchRuntime.MessageInspectors.Add(new WebAppServiceMessageInspector());
}
}
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
}
public class WebAppServiceMessageInspector : IDispatchMessageInspector
{
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext)
{
var prop = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];
HttpRequestMessageProperty httpProp = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];
object operationName;
request.Properties.TryGetValue(WebHttpDispatchOperationSelector.HttpOperationNamePropertyName, out operationName);
if (httpProp != null && operationName != null && operationName.ToString().ToLower() == "options".ToLower())
{
return "Options";
}
/*if (ISValid Login ) //checking here For a specific header & returning error or success.
{
return instanceContext;
}
else
{
throw new FaultException("Invalid Authorization Code" + Ac.ErrorMsg);
}*/
return instanceContext;
}
public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
}
}
我在不得不忽略检查的方法上添加了属性 [IgnoreValidation]。
public class IgnoreValidation : Attribute
{
}
从上面例如:在问题中:
[WebAppServiceBehavior]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class SyncService : ISyncService
{
public void DoWork() //check here
{
}
**[IgnoreValidation]**
public void DoWork2()//ignore here
{
}
}
&在Inspector中,我添加了这段代码来检查操作是否具有属性。
string actionName = Convert.ToString(operationName);
if (!string.IsNullOrEmpty(actionName))
{
var methodInfo = instanceContext.Host.Description.ServiceType.GetMethod(actionName);
if (methodInfo != null)
{
var customAttributes = methodInfo.GetCustomAttributes(false);
if (customAttributes.Any(ca => ca.GetType().Equals(typeof(IgnoreValidation))))
{
return instanceContext;
}
}
}
在 WCF 服务上,我添加了一个属性 [WebAppServiceBehavior],它检查服务消息中的某些 headers 的真实性。
我是否可以在某些可以忽略这些检查的特定方法上使用其他属性。
我的问题是我在一个服务中有 20 个方法,我只想从该检查中排除 2 个方法。
[WebAppServiceBehavior]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class SyncService : ISyncService
{
public void DoWork() //check here
{
}
public void DoWork2()//ignore here
{
}
}
public class WebAppServiceBehavior : Attribute, IServiceBehavior
{
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
// throw new NotImplementedException();
foreach (ChannelDispatcher ch in serviceHostBase.ChannelDispatchers)
{
foreach (var endptDispatcher in ch.Endpoints)
{
endptDispatcher.DispatchRuntime.MessageInspectors.Add(new WebAppServiceMessageInspector());
}
}
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
}
public class WebAppServiceMessageInspector : IDispatchMessageInspector
{
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext)
{
var prop = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];
HttpRequestMessageProperty httpProp = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];
object operationName;
request.Properties.TryGetValue(WebHttpDispatchOperationSelector.HttpOperationNamePropertyName, out operationName);
if (httpProp != null && operationName != null && operationName.ToString().ToLower() == "options".ToLower())
{
return "Options";
}
/*if (ISValid Login ) //checking here For a specific header & returning error or success.
{
return instanceContext;
}
else
{
throw new FaultException("Invalid Authorization Code" + Ac.ErrorMsg);
}*/
return instanceContext;
}
public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
}
}
我在不得不忽略检查的方法上添加了属性 [IgnoreValidation]。
public class IgnoreValidation : Attribute
{
}
从上面例如:在问题中:
[WebAppServiceBehavior]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class SyncService : ISyncService
{
public void DoWork() //check here
{
}
**[IgnoreValidation]**
public void DoWork2()//ignore here
{
}
}
&在Inspector中,我添加了这段代码来检查操作是否具有属性。
string actionName = Convert.ToString(operationName);
if (!string.IsNullOrEmpty(actionName))
{
var methodInfo = instanceContext.Host.Description.ServiceType.GetMethod(actionName);
if (methodInfo != null)
{
var customAttributes = methodInfo.GetCustomAttributes(false);
if (customAttributes.Any(ca => ca.GetType().Equals(typeof(IgnoreValidation))))
{
return instanceContext;
}
}
}