2015-06-09 4 views
0

Ниже приведен код, хорошо работающий в среде разработки 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 загрузить синхронно и все работало нормально.

+0

Проверьте свои журналы (ы) IIS, чтобы узнать, есть ли у вас какие-либо скрытые ошибки. – SteveFerg

+0

Можете ли вы найти загруженный файл в любом месте на машине? –

+0

@SteveFerg обновил содержимое файла журнала w3c. Я не вижу никакой другой ошибки. –

ответ

2

Я думаю, причина, по которой вы всегда получаете 200 OK, состоит в том, что файл обрабатывается в async-задаче. Таким образом, задача запущена и возвращается 200 OK. Любая ошибка при обработке файла теряется, потому что запрос уже закрыт.

Чтобы поймать ошибку, вы можете записывать исключения из задачи в базу данных. Или удалите задачу и сохраните файл не async. В этом случае я думаю, что вы получите ошибку, а не 200.

Причина, по которой файл не написан, вероятно, должен выполнять IIS, поскольку он работает на машине разработчика. Одна из причин может заключаться в том, что файлы не могут быть сохранены внутри inetpub. Поэтому создайте папку вне inetpub и повторите попытку.

Еще одна причина может заключаться в том, что у IIS недостаточно прав. В этом случае установите права на папку в проводнике для процесса, запускающего IIS.

- EDIT -

перечитываю свой вопрос. Если он иногда терпит неудачу, это говорит о том, что IIS может писать в папку.

В этом случае это может иметь отношение к асинхронному файлу. Возможно, поток закрыт или неполный.

+0

Спасибо. позвольте мне попытаться сообщить вам. –

+0

Любые идеи о том, как их проверить? –

+0

Если это связано с асинхронными файлами, я бы добавил try-catch внутри задачи и регистрировал любое исключение в базе данных. Есть ли один файл, который всегда терпит неудачу? –

Смежные вопросы