【问题标题】:Entity Framework data service request headers for mvcmvc 的实体框架数据服务请求标头
【发布时间】:2021-07-08 12:50:32
【问题描述】:
我们有一个实体框架 Web 服务,需要身份验证才能访问。每次发送请求时都需要进行此身份验证。
系统即时编辑通过覆盖 mainWindow.xaml.cs 文件中实体容器的 OnSendingRequest 事件,使其在 WPF 应用程序中完美运行。然后将授权添加到标题中。我发现一个资源告诉我做类似的事情,但我不知道这在 ASP.NET MVC 项目中是如何工作的,因为该资源似乎只给出了如何在 WPF 中为单个请求执行此操作的示例。 How to: Set Headers in the Client Request (WCF Data Services
我需要为每个请求为 mvc 项目的连接创建相同的身份验证标头。
【问题讨论】:
标签:
c#
asp.net-mvc
wpf
entity-framework
wcf-data-services
【解决方案1】:
您可以尝试使用消息拦截器插入身份验证标头。
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, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
clientRuntime.ClientMessageInspectors.Add(new ClientMessageLogger());
}
public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
return;
}
public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
{
return;
}
}
在BeforeSendRequest方法中,可以插入一个header,要应用这个消息拦截器,需要在客户端的服务引用中添加[CustomBehavior]。
像这样:
【解决方案2】:
如果其他人觉得这很有用,我偶然解决了这个问题。
我创建了一个静态类和一个静态方法,可以从项目中的任何页面调用。使用此代码:
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;
这既创建并返回服务的实例,在调用方法中使用,也自动创建授权并执行。
这必须在与服务通信的每个控制器上完成。
享受吧。