Ниже приведен код, хорошо работающий в среде разработки VS 2012, изображения сохраняются в App_Data.Загрузка файла web api 2.0 после развертывания в IIS 8.5
Когда я развернул то же самое на 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
<?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, но я не вижу файл в App_Data в IIS.
W3C Log
#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
Размер файлов в несколько KBS
Edit: Проблема, кажется, с асинхронной поэтому я последовал https://stackoverflow.com/a/20356591/2922388 загрузить синхронно и все работало нормально.
Проверьте свои журналы (ы) IIS, чтобы узнать, есть ли у вас какие-либо скрытые ошибки. – SteveFerg
Можете ли вы найти загруженный файл в любом месте на машине? –
@SteveFerg обновил содержимое файла журнала w3c. Я не вижу никакой другой ошибки. –