我正在尝试实施“某种”服务器 - 客户端&某些WCF服务的零配置安全性。
我在www上找到的最好的(也是最简单的)解决方案是在http://www.dotnetjack.com/post/Automate-passing-valuable-information-in-WCF-headers.aspx(客户端)和http://www.dotnetjack.com/post/Processing-custom-WCF-header-values-at-server-side.aspx(对应的服务器端)中描述的解决方案。
以下是我对RequestAuth的实现(在上面的第一个链接中描述):
using System;
using System.Diagnostics;
using System.ServiceModel;
using System.ServiceModel.Configuration;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Description;
using System.ServiceModel.Channels;
namespace AuthLibrary
{
/// <summary>
/// Ref: http://www.dotnetjack.com/post/Automate-passing-valuable-information-in-WCF-headers.aspx
/// </summary>
public class RequestAuth : BehaviorExtensionElement, IClientMessageInspector, IEndpointBehavior
{
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private string headerName = "AuthKey";
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private string headerNamespace = "http://some.url";
public override Type BehaviorType
{
get { return typeof(RequestAuth); }
}
protected override object CreateBehavior()
{
return new RequestAuth();
}
#region IClientMessageInspector Members
// Keeping in mind that I am SENDING something to the server,
// I only need to implement the BeforeSendRequest method
public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
throw new NotImplementedException();
}
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
MessageHeader<string> header = new MessageHeader<string>();
header.Actor = "Anyone";
header.Content = "TopSecretKey";
//Creating an untyped header to add to the WCF context
MessageHeader unTypedHeader = header.GetUntypedHeader(headerName, headerNamespace);
//Add the header to the current request
request.Headers.Add(unTypedHeader);
return null;
}
#endregion
#region IEndpointBehavior Members
public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
throw new NotImplementedException();
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.MessageInspectors.Add(this);
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
throw new NotImplementedException();
}
public void Validate(ServiceEndpoint endpoint)
{
throw new NotImplementedException();
}
#endregion
}
}
首先,我将此代码放在我的客户端WinForms应用程序中,但后来我在签名时遇到了问题,因为我必须在所有第三方引用中签名http://msdn.microsoft.com/en-us/library/h4fa028b(v=VS.80).aspx在“不应该命名的内容”部分“陈述:
通常,您应该避免强命名应用程序EXE程序集。强命名的应用程序或组件不能引用弱命名的组件,因此强命名EXE会阻止EXE引用随应用程序部署的弱命名的DLL。
因此,Visual Studio项目系统没有强名称应用程序EXE。相反,它强烈命名应用程序清单,该清单内部指向弱命名的应用程序EXE。
我希望VS避免这个问题,但我没有运气,它抱怨所有未签名的引用,所以我在我的解决方案中创建了一个单独的“WCF服务库”项目,其中只包含上面的代码并签署了该代码。< / p>
此时整个解决方案编译得还不错。
这是我的问题:
当我启动“WCF服务配置编辑器”时,我能够添加新的行为元素扩展名(比如“AuthExtension”),但是当我尝试将该扩展名添加到我的终点行为时,它给了我:
调用目标抛出了异常。
所以我被困在这里。
有什么想法吗?
答案 0 :(得分:3)
你有一些:
throw new NotImplementedException();
你的代码中的。这些可能是被抛出的例外。尝试删除它们,看看是否收到同样的错误。
答案 1 :(得分:1)
Shiraz Bhaiji是对的。框架确实调用那些你没有实现异常的方法。删除它。