C# mvc5应用中的用户代理
我有一个MVC5应用程序,其后端是WebAPI。对于服务器的每个请求,我都需要提供可以在控制器操作方法中获得的用户代理,如C# mvc5应用中的用户代理,c#,browser,asp.net-mvc-5,user-agent,C#,Browser,Asp.net Mvc 5,User Agent,我有一个MVC5应用程序,其后端是WebAPI。对于服务器的每个请求,我都需要提供可以在控制器操作方法中获得的用户代理,如var UserAgent=request.UserAgent.ToString()并随后在其他类中传递,如(Controller=>Service=>HttpRequester=>XXXHttpClient),最后在XXXHttpClient类中的实际请求中使用,但我认为可能有更好的方法来实现这一点。我尝试用谷歌搜索,但没有找到任何相关信息,因此,如果我想直接在XXXHtt
var UserAgent=request.UserAgent.ToString()编码>并随后在其他类中传递,如(Controller=>Service=>HttpRequester=>XXXHttpClient),最后在XXXHttpClient类中的实际请求中使用,但我认为可能有更好的方法来实现这一点。我尝试用谷歌搜索,但没有找到任何相关信息,因此,如果我想直接在XXXHttpClient类中获取用户代理,而不是随后通过,请任何人指导我最佳做法是什么。这是一个有很多可能答案的广泛问题
通过所有层传递数据通常不是一件好事
我要做的是制作一个MVC操作过滤器,它捕获用户代理并将其设置为一个对象。对象类可以如下所示:
public class RequestContext
{
public string UserAgent { get; set; }
}
使用依赖项注入框架为每个请求注入一次。然后动作过滤器和依赖于数据的层将使用相同的实例,允许您将数据获取到任何需要它的层
另一个使用静态属性的选项:
HttpContext.Current.Request.UserAgent
更高的性能,更容易阅读,但可测试性更低:)这是一个有很多可能答案的广泛问题
通过所有层传递数据通常不是一件好事
我要做的是制作一个MVC操作过滤器,它捕获用户代理并将其设置为一个对象。对象类可以如下所示:
public class RequestContext
{
public string UserAgent { get; set; }
}
使用依赖项注入框架为每个请求注入一次。然后动作过滤器和依赖于数据的层将使用相同的实例,允许您将数据获取到任何需要它的层
另一个使用静态属性的选项:
HttpContext.Current.Request.UserAgent
更高的性能,更易于阅读,但可测试性更低:)每个请求一次意味着在操作方法级别?是的,通常DI框架提供“暂时”范围,这意味着为每个需要它的对象创建一个实例,“单一”范围意味着一个实例由所有请求它的对象共享,以及一个“请求”范围,这意味着作为单个HTTP请求的一部分创建的任何对象都将获得相同的实例。在Ninject中,这是InRequestScope()
。从NuGet安装(如果使用MVC5)。它将生成一个文件,您可以在其中注册依赖项。您可以使用类似于kernel.Bind().ToSelf().InRequestScope()的内容代码>。您可以在这里找到不同的作用域:我可以使用System.Web.HttpContext.Current.Request.UserAgent.ToString()吗;在XXXHttpClient类中,HttpContext.Current.Request.UserAgent的最大字符数
?每个请求一次意味着在操作方法级别?是的,通常DI框架提供“瞬态”作用域,这意味着为每个需要它的对象创建一个实例,“单例”作用域表示单个实例由请求它的所有对象共享,而“请求”作用域表示作为单个HTTP请求的一部分创建的任何对象都会获得相同的实例。在Ninject中,这是InRequestScope()
。从NuGet安装(如果使用MVC5)。它将生成一个文件,您可以在其中注册依赖项。您可以使用类似于kernel.Bind().ToSelf().InRequestScope()的内容代码>。您可以在这里找到不同的作用域:我可以使用System.Web.HttpContext.Current.Request.UserAgent.ToString()吗;在XXXHttpClient类中,HttpContext.Current.Request.UserAgent的最大字符数?