我最近遇到了一个让我陷入困境的问题。
我在 WCF 中实现了一个自定义 AuthorizationManager,它首先必须按名称提取操作。WCF 服务通过 REST 和 SOAP 端点公开,因此我必须检查多个位置以找到继续通过身份验证过程所需的信息。
一切都很好,我有大约 15-20 个服务运行良好,但我最近遇到了一个问题,我无法使用我的正常方法提取操作名称。
拉取操作的代码如下:
public class AuthorizationManager : ServiceAuthorizationManager
{
private ServiceEndpoint _endpoint { get; set; }
public AuthorizationManager(ServiceEndpoint endpoint)
{
_endpoint = endpoint;
}
public override bool CheckAccess(OperationContext operationContext, ref Message message)
{
var buffer = message.CreateBufferedCopy(Int32.MaxValue);
message = buffer.CreateMessage();
var originalMessage = buffer.CreateMessage();
/*Step 1 - Pull Operation*/
string action = operationContext.IncomingMessageHeaders.Action ?? OperationContext.Current.IncomingMessageProperties["HttpOperationName"] as string;
DispatchOperation operation = operationContext.EndpointDispatcher.DispatchRuntime.Operations.FirstOrDefault(o => o.Name == action || o.Action == action);
Type hostType = operationContext.Host.Description.ServiceType;
var operationInfo = hostType.GetMethod(operation.Name);
/*Continue here using operationInfo - but operation is null*/
}
}
这对于为 REST 和 SOAP 端点提取正确操作很有用,但现在该操作为空。
服务定义如下:
[ServiceContract]
public interface ICollectionService
{
[OperationContract]
[WebGet]
CollectionResponse GetCollection()
}
一切似乎都很标准,我只是不明白为什么这与我的其他服务有任何不同。