Asp.net 如何在请求中设置用户主机地址

Asp.net 如何在请求中设置用户主机地址,asp.net,unit-testing,Asp.net,Unit Testing,我发现这段代码是为了进行单元测试而进行模拟请求的。我正在尝试设置userhostaddress,但我不清楚如何使用此代码中概述的相同方法来实现这一点。我认为这必须通过反射来完成,因为我发现设置标题是不允许的。有什么办法可以做到这一点吗 public static HttpContext FakeHttpContext() { var httpRequest = new HttpRequest("", "http://fakurl/", "");

我发现这段代码是为了进行单元测试而进行模拟请求的。我正在尝试设置userhostaddress,但我不清楚如何使用此代码中概述的相同方法来实现这一点。我认为这必须通过反射来完成,因为我发现设置标题是不允许的。有什么办法可以做到这一点吗

public static HttpContext FakeHttpContext()
        {
            var httpRequest = new HttpRequest("", "http://fakurl/", "");
            var stringWriter = new StringWriter();
            var httpResponse = new HttpResponse(stringWriter);
            var httpContext = new HttpContext(httpRequest, httpResponse);

            var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(),
                                                    new HttpStaticObjectsCollection(), 10, true,
                                                    HttpCookieMode.AutoDetect,
                                                    SessionStateMode.InProc, false);

            httpContext.Items["AspSession"] = typeof(HttpSessionState).GetConstructor(
                                        BindingFlags.NonPublic | BindingFlags.Instance,
                                        null, CallingConventions.Standard,
                                        new[] { typeof(HttpSessionStateContainer) },
                                        null)
                                .Invoke(new object[] { sessionContainer });

            httpContext.Request.Headers["REMOTE_ADDR"] = "XXX.XXX.XXX.XXX"; // not allowed
            return httpContext;
        }
我还尝试了这个模拟库:


由用户提供的主机地址仍然是只读的。

我发现的最佳方法是使用某种实现IContextService接口的ContextService。这个类/接口对可以执行您需要的任何操作。关键是,若您在单元测试中使用模拟框架,比如,那个么您可以连接一个模拟上下文服务来返回一个特定的ip地址

这篇StackOverflow文章有一些好的指针:

更新: 您发现的StackOverflow帖子也是一个不错的帖子:

我发现我通常只需要上下文/请求/响应对象的一些属性,所以我经常使用自己的较小变体:

公共类ContextService:IContextService
{
公共字符串GetUserHostAddress()
{
返回HttpContext.Current.Request.UserHostAddress;
}
}
公共接口IContextService
{
字符串GetUserHostAddress();
}
有了这个类/接口组合,我就可以使用Moq连接一个假的服务:

var contextMock=new Moq.Mock();
Setup(c=>c.GetUserHostAddress())。返回(“127.0.0.1”);

现在每次调用
contextMock.GetUserHostAddress()
,我都会得到“127.0.0.1”。滚动您自己的可以是一个很好的学习体验,特别是如果您不需要一个完整的(或尽可能完整的)HttpContext模拟的所有铃声和口哨的话。

我发现了这个,但不确定在控制器中设置它的位置。httpcontext是只读的。>>var requestContext=mvcmockhelopers.FakeHttpContext();我想我找到了一种将其传递给控制器的方法,但是userhostname仍然是只读的,所以对我没有任何好处:httpContext.Request.UserHostAddress=“127.0.0.1”;找到显示如何操作的此项:找到显示如何操作的此项: