在 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>
应用程序总是 returns 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
编辑:问题似乎与异步有关,所以我按照 同步上传并且工作正常。
我认为你总是得到 200 OK 的原因是因为文件是在异步任务中处理的。因此任务启动并返回 200 OK。由于请求已经关闭,处理文件的任何错误都将丢失。
要捕获错误,您可以将任务中的异常记录到数据库中。或者删除任务并保存文件而不是异步的。在那种情况下,我认为你会得到错误而不是 200 OK。
没有写入文件的原因可能与 IIS 有关,因为它在开发人员机器上运行。原因之一可能是文件可能未保存在 inetpub 中。所以在inetpub外创建一个文件夹再试一次。
还有一个原因可能是IIS权限不足。在这种情况下,为进程 运行 IIS.
在资源管理器中的文件夹上设置权限
-- 编辑 --
我重新阅读了你的问题。如果有时失败,则表明 IIS 可以写入该文件夹。
在那种情况下,它可能与异步文件保存有关。可能流已关闭或不完整。
以下代码在开发环境 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>
应用程序总是 returns 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
编辑:问题似乎与异步有关,所以我按照 同步上传并且工作正常。
我认为你总是得到 200 OK 的原因是因为文件是在异步任务中处理的。因此任务启动并返回 200 OK。由于请求已经关闭,处理文件的任何错误都将丢失。
要捕获错误,您可以将任务中的异常记录到数据库中。或者删除任务并保存文件而不是异步的。在那种情况下,我认为你会得到错误而不是 200 OK。
没有写入文件的原因可能与 IIS 有关,因为它在开发人员机器上运行。原因之一可能是文件可能未保存在 inetpub 中。所以在inetpub外创建一个文件夹再试一次。
还有一个原因可能是IIS权限不足。在这种情况下,为进程 运行 IIS.
在资源管理器中的文件夹上设置权限-- 编辑 --
我重新阅读了你的问题。如果有时失败,则表明 IIS 可以写入该文件夹。
在那种情况下,它可能与异步文件保存有关。可能流已关闭或不完整。