繁体   English   中英

在IIS 8.5上部署后,文件上传Web API 2.0错误

[英]File upload web api 2.0 error after deployment on IIS 8.5

下面的代码在VS 2012开发环境上运行良好,图像保存到App_Data。

当我在Win 8.1,IIS 8.5上部署相同组件时,缺少App_Data。 我手动创建了文件夹,并按照http://hintdesk.com/tutorial-publish-asp-net-web-api-in-iis-8-5-and-windows-8-1/中给出的属性进行设置。

我看到奇怪的行为,因为上传不一致。 有时上传失败。 不知道为什么。

该应用程序托管在完成开发的同一台计算机上,并且IIS上的端口号设置为同一开发端口#

    [HttpPost]
    [Route("v1/persons/{personId}/image")]
    public IHttpActionResult CreatePersonImage(int personId)
    {
        if (Request.Content.IsMimeMultipartContent())
        {
            var isUpdated = 0;
            Request.Content.ReadAsMultipartAsync<MultipartMemoryStreamProvider>(new MultipartMemoryStreamProvider()).ContinueWith((task) =>
            {
                MultipartMemoryStreamProvider provider = task.Result;
                foreach (HttpContent content in provider.Contents)
                {
                    Stream stream = content.ReadAsStreamAsync().Result;
                    Image image = Image.FromStream(stream);
                    //var testName = content.Headers.ContentDisposition.Name;
                    var imageFileFullName = Utils.GetImageFileFullName(personId + ".jpg");
                    image.Save(imageFileFullName);
                    PersonDb persondb = new PersonDb();
                    isUpdated = persondb.CreatePersonImage(new Person()
                    {
                        ImageFileName = Path.GetFileName(imageFileFullName),
                        PersonId = personId
                    }, out InternalServerErr);
                }
            });
            return Ok();
        }
        else
        {
            return BadRequest("Error in Content-type. It should be multipart/form-data");
        }
    }

public static string GetImageFileFullName(string imageFileName)
{
    return Path.Combine(HostingEnvironment.MapPath("~/App_Data"), imageFileName);
}

IIS 8.5上的Web配置

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please     
visit
http://go.microsoft.com/fwlink/?LinkId=301879
-->
<configuration>
<appSettings>
</appSettings>
<system.web>
<compilation targetFramework="4.5">
  <assemblies>
    <add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </assemblies>
</compilation>
<httpRuntime targetFramework="4.5" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
<connectionStrings>
<add name="Conn" connectionString="Server=localhost;Database=sampledb;User Id=sa; Password=test123"></add>
</connectionStrings>
</configuration>

该应用程序始终返回200 OK状态,但在IIS的App_Data上看不到该文件。

W3C日志

#Fields: date time s-ip cs-method cs-uri7-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status sc-bytes cs-bytes time-taken CutomType CotentLength
2015-06-10 10:27:52 192.168.10.22 POST /v1/persons/4/image - 50737 - 192.168.10.22 RestSharp/105.1.0.0 - 200 0 0 210 6198 95 multipart/form-data;+boundary=-----------------------------28947758029299 5830

文件大小为几KB

编辑:问题似乎与异步有关,所以我跟随https://stackoverflow.com/a/20356591/2922388同步上传,并且工作正常。

我认为您总能获得200 OK的原因是因为文件是在异步任务中处理的。 因此,任务开始,并返回200 OK。 处理该文件的任何错误都将丢失,因为请求已关闭。

要捕获错误,您可以将任务中的异常记录到数据库中。 或删除任务并保存文件,使其不异步。 在那种情况下,我认为您会得到错误而不是200 OK。

由于未在开发人员计算机上工作,因此未写入文件的原因可能是使用IIS。 原因之一可能是文件未保存在inetpub中。 因此,在inetpub之外创建一个文件夹,然后重试。

另一个原因可能是IIS的权限不足。 在这种情况下,请在资源管理器中的文件夹上为运行IIS的进程设置权限。

-编辑-

我重新阅读了您的问题。 如果有时失败,则表明IIS可以写入该文件夹。

在这种情况下,它可能与异步文件保存有关。 流可能已关闭或不完整。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM