C# mvc5应用中的用户代理

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

我有一个MVC5应用程序,其后端是WebAPI。对于服务器的每个请求,我都需要提供可以在控制器操作方法中获得的用户代理,如
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的最大字符数?