【问题标题】:WebAPI 2 file upload works in develop, gives 404 in productionWeb API 2 文件上传在开发人员中工作,在生产中提供 404
【发布时间】:2015-01-14 13:18:13
【问题描述】:

我开发了一个文件上传工具(对 angularjs 使用 nervgh 文件上传),它在开发中运行良好。文件被发送到 WebApi 上传控制器:

   public class UploadController : ApiController
{       
    public async Task<HttpResponseMessage> PostFormData()
    {
        // Check if the request contains multipart/form-data.
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        string root = HttpContext.Current.Server.MapPath(@"~\" + Properties.Settings.Default.uploadDir);
        var provider = new MultipartFormDataStreamProvider(root);

        var documentNewDir = "";
        var documentRelative = "";
        var fileName = "";

        try
        {
            // Read the form data.
            await Request.Content.ReadAsMultipartAsync(provider);

            // This illustrates how to get the file names.
            foreach (MultipartFileData file in provider.FileData)
            {
                var vergaderDate = Convert.ToDateTime(provider.FormData["vergaderdatum"]);
                var jaar = vergaderDate.Year;
                var maand= vergaderDate.Month.ToString(CultureInfo.CurrentCulture).PadLeft(2, '0');
                var dag =vergaderDate.Day.ToString(CultureInfo.CurrentCulture).PadLeft(2, '0');

                //absolute path to documents new dir
                documentNewDir = HttpContext.Current.Server.MapPath("/") + Properties.Settings.Default.documentsBaseDir + @"\" + jaar + @"\" + maand + @"\" + dag;

                //filename
                fileName = file.Headers.ContentDisposition.FileName.Replace("\"", string.Empty);

                //relativePath and filename
                documentRelative = Properties.Settings.Default.documentsBaseDir + @"/" + jaar + @"/" + maand + @"/" + dag + @"/"+ fileName;


                if(!Directory.Exists(documentNewDir))
                    Directory.CreateDirectory(documentNewDir);
                File.Move(file.LocalFileName, documentNewDir + @"\"+fileName);
            }

            var response = Request.CreateResponse(HttpStatusCode.OK, documentRelative);
            return response;
        }
        catch (System.Exception e)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
        }
    }

}

这在开发设置中运行良好,但部署到 MS 2012 服务器 IIS 8.5 生产服务器我在 POST API 调用 api/upload 时收到 404。

该应用程序支持其他一些在开发/生产环境中都能正常工作的 WebAPI 调用......我该如何开始调查/调试这种情况?

这是 Fiddler 中的调用(省略了文件数据....):

-----------------------------7df2b09e0350
Content-Disposition: form-data; name="vergaderdatum"

2015-01-30T00:00:00
 -----------------------------7df2b09e0350
Content-Disposition: form-data; name="file"; filename="5.0. Vooraankondiging themabijeenkomstSamen naar Buiten, 17 sept.pdf"
Content-Type: application/pdf

%PDF-1.5
%âãÏÓ

和回应

HTTP/1.1 404 Not Found
Content-Type: text/html
Server: Microsoft-IIS/8.5
X-Powered-By: ASP.NET
Date: Wed, 14 Jan 2015 15:31:08 GMT
Content-Length: 1245

【问题讨论】:

  • 尝试使用 Fiddler 或 Postman(适用于 Chrome)编写 POST 请求并将其发送到您的 Upload/PostFormData 操作,看看您会得到什么。如果您收到 404,则您的操作不会被调用。如果你得到 500,那就是行动的答案。我推荐 Postmand:写一篇 Fiddler 的帖子要直观得多……除非你在其他场合使用过 Fiddler
  • 用提琴手数据编辑了调用
  • 请自己编写请求,不要在 fiddler 中捕获文件发布。我知道它不会满足文件。希望响应能给我们指明下一步的方向
  • 你的意思是一个普通的 POST 或 GET API?
  • Get(在 Postman 中)导致:不允许的方法和 POST(没有附加文件)给出 415 不受支持的媒体类型

标签: iis file-upload asp.net-web-api2


【解决方案1】:

我发现了错误! 在生产中,该网站被安装为默认网站的子域。在javascript中是对上传方法(/api/upload)的引用,我在上传文件的javascript中添加了/bisbeheer/api/upload等子域的名称

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2012-02-18
    • 2020-12-13
    • 1970-01-01
    • 2013-03-20
    • 2014-06-19
    相关资源
    最近更新 更多