【问题标题】: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;
      

      这既创建并返回服务的实例,在调用方法中使用,也自动创建授权并执行。

      这必须在与服务通信的每个控制器上完成。 享受吧。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-05
        • 2023-03-25
        • 2020-06-10
        相关资源
        最近更新 更多