问题描述
我是服务和服务器方面的新手。所以这可能是一个非常简单的问题。
我们有一个实体框架 Web 服务,需要身份验证才能访问。每次发送请求时都需要进行此身份验证。
系统即时编辑通过覆盖 mainWindow.xaml.cs 文件中实体容器的 OnSendingRequest 事件使其完美适用于 WPF 应用程序。然后将授权添加到标题中。我发现了一个资源,它告诉我做类似的事情,但我不知道这在 ASP.NET MVC 项目中是如何工作的,因为该资源似乎只给出了如何在 WPF 中为单个请求执行此操作的示例。 How to: Set Headers in the Client Request (WCF Data Services
对于每个请求,我都需要为 mvc 项目的连接制作相同的身份验证标头。 任何帮助表示赞赏。
解决方法
您可以尝试使用消息拦截器插入身份验证标头。
public class ClientMessageLogger : IClientMessageInspector
{
public void AfterReceiveReply(ref Message reply,object correlationState)
{
MessageHeader header1 = MessageHeader.CreateHeader("Testreply","http://Test","Test");
request.Headers.Add(header1);
}
public object BeforeSendRequest(ref Message request,IClientChannel channel)
{
MessageHeader header = MessageHeader.CreateHeader("UserAgent","http://User","User1");
reply.Headers.Add(header);
return null;
}
}
[AttributeUsage(AttributeTargets.Interface)]
public class CustomBehavior : Attribute,IContractBehavior
{
public Type TargetContract => typeof(ServiceReference1.ICalculator);
public void AddBindingParameters(ContractDescription contractDescription,ServiceEndpoint endpoint,BindingParameterCollection bindingParameters)
{
return;
}
public void ApplyClientBehavior(ContractDescription contractDescription,ClientRuntime clientRuntime)
{
clientRuntime.ClientMessageInspectors.Add(new ClientMessageLogger());
}
public void ApplyDispatchBehavior(ContractDescription contractDescription,DispatchRuntime dispatchRuntime)
{
return;
}
public void Validate(ContractDescription contractDescription,ServiceEndpoint endpoint)
{
return;
}
}
在BeforeSendRequest方法中,可以插入一个header,要应用这个消息拦截器,需要在客户端的服务引用中添加[CustomBehavior]。
,如果其他人觉得这有用,我无意中解决了这个问题。
我创建了一个静态类和一个静态方法,可以从项目中的任何页面调用。使用此代码:
var serviceUri = new Uri(WebConfigurationManager.AppSettings["DataServiceUri"]);
myService result = new myService(serviceUri);
result.SendingRequest += new EventHandler<SendingRequestEventArgs>((s,e) =>
{
string authenticationString = applicationName + " " + applicationId;
e.RequestHeaders.Add("Authorization",authenticationString);
});
return result;
这既会创建并返回服务的实例,以在调用方法中使用,还会自动创建授权并执行它。
这必须在与服务通信的每个控制器上完成。 享受。