【问题标题】:C# Test File UploadC# 测试文件上传
【发布时间】:2015-07-22 08:12:16
【问题描述】:

我浏览了各种帖子并尝试了几件事,但我无法让事情正常工作。我不觉得它应该那么难,但这就是我得到的。我只是想将文件发布到我的服务器以进行测试。它应该像我从网页上的标准 <input type="file"/> 上传它一样工作。

这是我要测试的实际处理程序:

[Route("MyAction")]
[HttpPost]
public IHttpActionResult MyAction()
{
    try
    {
        var request = HttpContext.Current.Request;
        if (request.Files.Count == 1)
        {
            var postedFile = request.Files[0];
            if (request.Files[0].FileName.EndsWith(".zip"))
            {
                // unzip the file
                // do stuff
            }
        }
    }
    catch 
    {
        return new ValidationError("An error has occurred and has been logged");
    }
}

这是我的测试:

public void SetupServer()
{
    server = TestServer.Create(app =>
    {
        var startup = new Startup();
        startup.ConfigureOAuth(app);

        var config = new HttpConfiguration();
        WebApiConfig.Register(config);

        app.UseWebApi(config);
    });
}


[Test]
public async Task MyActionTest()
{
    SetupServer();
    Uri = "/api/myClass/myRoute";

    var file = Properties.Resources.myZipFile;

    var boundary = "------------------------" + DateTime.Now.Ticks;

    var multipartFileContent = new MultipartFormDataContent(boundary);
    var content = new ByteArrayContent(file);
    content.Headers.Add("Content-Type", "application/octet-stream");
    multipartFileContent.Add(content, "myFileName", "myZipFile.zip");

    var serverResp = (await server.CreateRequest(Uri)
        .And(req => req.Content = multipartFileContent)
        .PostAsync());
}

运行此测试会导致var request = HttpContext.Current.Request; 出现错误,因为HttpContext.Current 由于某种原因为空。我是否以错误或艰难的方式解决这个问题?我觉得应该没那么难。

【问题讨论】:

  • 你是如何解决这个问题的?

标签: c# asp.net-web-api nunit owin


【解决方案1】:

根本问题与 HttpContext.Current 的工作方式有关。这个属性在 ASP.NET 框架中是“神奇的”,因为它对于请求-响应操作是唯一的,但会根据执行需要在线程之间跳转 - 它是有选择地在线程之间共享的。

当您在 ASP.NET 处理管道之外使用 HttpContext.Current 时,魔法就消失了。当您使用异步编程风格切换线程时,该属性在继续后为空。 http://www.necronet.org/archive/2010/07/28/unit-testing-code-that-uses-httpcontext-current-session.aspx

【讨论】:

  • 所以这适用于设置当前上下文,但是如何根据请求设置文件?
【解决方案2】:

问题是 HttpContext.Current 在您正在启动的自托管测试中不可用。

看这里:

HttpSelfHostServer and HttpContext.Current

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2011-10-18
    • 2019-12-28
    相关资源
    最近更新 更多