C# 如何在“主机”上设置IP(UserHostAddress);嘲笑';BaseHttpContext?
我试图创建一个虚拟的C# 如何在“主机”上设置IP(UserHostAddress);嘲笑';BaseHttpContext?,c#,asp.net,.net,mocking,C#,Asp.net,.net,Mocking,我试图创建一个虚拟的BaseHttpContext,在不需要执行实际请求的情况下进行一些(模拟)测试。我想在虚拟上下文中添加一个IP地址 string url = "http://www.google.com"; //wrap in uri Uri uri = new Uri(url); //create request var request = new HttpRequest("", uri.GetLeftPart(UriPartial.Path), uri.Query); reques
BaseHttpContext
,在不需要执行实际请求的情况下进行一些(模拟)测试。我想在虚拟上下文中添加一个IP地址
string url = "http://www.google.com";
//wrap in uri
Uri uri = new Uri(url);
//create request
var request = new HttpRequest("", uri.GetLeftPart(UriPartial.Path), uri.Query);
request.ServerVariables.Add("REMOTE_ADDR", ip);
//dummy context
HttpContext context = new HttpContext(
new HttpRequest("", uri.GetLeftPart(UriPartial.Path), uri.Query),
new HttpResponse(new StringWriter(System.Text.Encoding.UTF8))
);
//wrap context
var contextWrapper = new HttpContextWrapper(context);
IP应该反映在BaseHttpContext.Request.UserHostAddress
中。像这样添加一个IP:request.ServerVariables.Add(“REMOTE\u ADDR”,IP)代码>,导致以下异常:
不支持指定的方法
看起来伪造一个HttpContext
并不是那么容易,需要做很多工作。使用模拟框架可以使事情变得更简单。下面是一个示例,使用:
//
///伪造HTTP上下文。
///
///URL。
///知识产权。
///推荐人。
///HTTP上下文。
公共静态HttpContextBase FakeHttpContext(字符串url、字符串ip、字符串引用)
{
Uri=新的Uri(url);
var context=newmock();
var files=newmock();
var request=newmock();
var response=newmock();
var session=newmock();
var server=newmock();
var user=new Mock();
var identity=newmock();
request.Setup(req=>req.ApplicationPath)。返回(“~/”;
Setup(req=>req.AppRelativeCurrentExecutionFilePath)。返回(“~/”;
request.Setup(req=>req.PathInfo).Returns(string.Empty);
request.Setup(req=>req.Form).Returns(newNameValueCollection());
Setup(req=>req.QueryString).Returns(HttpUtility.ParseQueryString(uri.Query));
request.Setup(req=>req.Files).Returns(Files.Object);
request.Setup(req=>req.UserHostAddress).Returns(ip);
request.Setup(req=>req.urlreferer).Returns(新Uri(referer));
request.Setup(req=>req.Url).Returns(uri);
request.Setup(req=>req.RawUrl).Returns(url);
response.Setup(res=>res.ApplyAppPathModifier(It.IsAny())。返回((字符串virtualPath)=>virtualPath);
user.Setup(usr=>usr.Identity).Returns(Identity.Object);
identity.SetupGet(ident=>ident.IsAuthenticated).返回(true);
Setup(ctx=>ctx.Request).Returns(Request.Object);
Setup(ctx=>ctx.Response).Returns(Response.Object);
Setup(ctx=>ctx.Session).Returns(Session.Object);
Setup(ctx=>ctx.Server).Returns(Server.Object);
Setup(ctx=>ctx.User).Returns(User.Object);
返回context.Object;
}
灵感来源于。非常有用。要解决您的问题,您只需要从post中实现HttpRequestExtensions
和NameValueCollectionExtensions
类
您可以这样使用它:
string url = "http://127.0.0.1";
var request = new HttpRequest(string.Empty, url, string.Empty);
request.AddServerVariable("REMOTE_ADDR", "127.0.0.1");
可能是@DennisTraub的复制品,我不认为它是复制品。我不是在做真正的请求。我需要“模拟”一个HttpContext.hi。。你能举出任何例子来使用这个http上下文吗?
string url = "http://127.0.0.1";
var request = new HttpRequest(string.Empty, url, string.Empty);
request.AddServerVariable("REMOTE_ADDR", "127.0.0.1");