在WCF服务上,我添加了一个属性[WebAppServiceBehavior],该属性检查服务消息中的某些标头是否真实。
是否有可能在某些可忽略这些检查的特定方法上使用其他属性。
我的问题是我在服务中有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)
{
}
}
答案 0 :(得分:0)
我在方法上添加了一个属性[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;
}
}
}