2015-03-25 1 views
10

Мое приложение ASP.NET MVC использует неуправляемую внешнюю DLL, написанную на C++.Неуправляемая DLL в приложении ASP.NET MVC приводит к остановке пула приложений на сервере IIS

Этот веб-сайт отлично работает с Visual Studio, правильно размещая и получая доступ к внешним DLL. Однако, когда сайт публикуется на локальный веб-сервер (работает IIS 7.5), а не в Visual Studio IIS Express, я получаю следующее сообщение об ошибке:

HTTP Error 503. The service is unavailable. 

Внешний DLL находится в каталоге бен в website.On взглянув на журналы IIS, я заметил, что defaultapppool останавливается каждый раз, когда я вызываю DLL.

HTTP/1.1 GET /Bio/Select/3 503 1 Disabled DefaultAppPool 

Я попытался следующие:

  1. Я поставил DLL в System32 и syswow64 папку.
  2. Предоставил полные права на ASPNET, IIS_WPG и IUSR (для этого сервера) в каталог bin сайта и перезагрузился.
  3. Добавлена ​​внешняя библиотека DLL в качестве существующих объектов для проектов и установлена ​​для свойства «Копировать в вывод» в «Копировать всегда».
  4. Опубликован приложение с целевой платформой x86, поскольку dll 32 бит.
  5. У меня IIS, работающий на встроенном режиме, разрешает 32 бит.
  6. Я поставил DLL в каталоге \ System32 \ Inetsrv

Ниже приведен фрагмент кода, как я называю DLL,

 [HttpGet] 
    public ActionResult Select(int ID) 
    { 
     int res = BSSDK.BS_InitSDK(); 
     if (res != BSSDK.BS_SUCCESS) 
     { 
      ModelState.AddModelError("Error", "SDK failed to initialise"); 
     } 
     return View() 
    } 

    public class BSSDK 
{ 
    [DllImport("BS_SDK.dll", 
     CharSet = CharSet.Ansi, 
     EntryPoint = "BS_InitSDK")] 
    public static extern int BS_InitSDK(); 
} 

Мой взгляд

@model IEnumerable<BasicSuprema.Models.BioUser> 

@using GridMvc.Html 
@{ 
    ViewBag.Title = "Bio Users On DB"; 
} 
<div class="well well-sm"><h3>@ViewBag.Title</h3></div> 
@Html.ValidationMessage("Error") 
<div class="grid-wrap"> 
    @Html.Grid(Model).Named("UsersGrid").Columns(columns => 
        { 
         columns.Add(c => c.BioUserID).Titled("ID"); 
         columns.Add(c => c.UserName).Titled("User"); 

        }).WithPaging(10).Sortable(true) 

</div> 

Подобные вопросы включают Unmanaged DLLs fail to load on ASP.NET server How to call unmanaged code in ASP.NET website and host it in IIS

Unable to call the DLL from ASP.NET

Когда я принимал его на веб-сервере под управлением IIS 8 я получаю ниже error.So может быть, на моем локальном сервере IIS возвращает ошибку 503 сог она не может найти библиотеку DLL, но я все же определить это как для у меня нет доступа для копирования dll в системные папки.

Unable to load DLL 'BS_SDK.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E) 
+2

Внутри сервера должна быть более подробная ошибка, включенная в журнал приложений. COULd вы смотрите и публикуете детали? –

+0

Вы используете профиль клиента .net framework в пуле приложений? – User2012384

+0

@MitchelSellers, с которыми вы ссылаетесь? Не могли бы вы направить меня на место регистрации приложения? – GotaloveCode

ответ

0

Я удалил и установил IIS заново, а затем повторил все указанные шаги в вопросе и, наконец, работал.

1

Для того, чтобы найти где ваше приложение ищет вашу DLL, я рекомендую Microsoft FusionLog. Он будет не только регистрировать, где CLR ищет DLL, но также записывает более подробную информацию о том, почему загрузка не удалась.

Кроме того, было бы полезно узнать, действительно ли процесс открывает дескриптор файла для dll. Вы можете узнать через Process Explorer: * Загрузить ProcessExplorer и запустить его как администратор. * Добавить фильтр для «Название процесса» и использовать «w3wp.exe» * Запустите пул приложений * Поиск в проводнике поиска для «BS_SDK.dll», и вы увидите, в какой директории он пытался его загрузить.

+0

спасибо @chrisn заглянет в него, когда я получу некоторое время. Я использовал проводник процессов, но попробовал fusionlog – GotaloveCode

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