Проблема веб-службы ASMX, связывающаяся со службой Windows в отдельном потоке - PullRequest
3 голосов
/ 30 декабря 2010

Существует служба Windows на Windows Server 2003 (виртуальная машина Amazon).Некоторые приложения могут общаться с ним (используя каналы, но для этого есть обертка).Это проверено, и это работает.Кроме того, существует веб-служба, написанная на C # (ASP.NET), которая взаимодействует с упомянутой службой Windows.Когда вызывается веб-метод, он создает экземпляр класса и вызывает функцию - функция «подключается» к службе Windows и публикует в ней задание.Но если внутри Web-метода создается поток, а функция, которая «подключается» к службе Windows, вызывается внутри потока - соединение не устанавливается.Подключение к службе Windows использует каналы.Веб-сервис работает на IIS7.Стоит отметить, что все работает на моем локальном компьютере, либо из отладчика (локальный сервер, запущенный VS 2010), либо из IE, когда я вызываю веб-метод в веб-службе, которая работает в локальном IIS7.В местном все работает - но на Amazon Instance нет.Я не веб-программист, поэтому я думаю, что есть проблемы с безопасностью.Любой намек?Спасибо.

РЕДАКТИРОВАТЬ: комментарий Уве напомнил мне - веб-метод сначала пытается загрузить некоторые файлы, используя http, и сохраняет их по пути C: \ intetpub \ wwwroot \ files \ ". Он работает, если файлы загружаютсяиз веб-метода, но загрузка не удалась, если это было сделано из другого потока, созданного в веб-методе. Исключение составляло: доступ запрещен. Итак, я изменил настройки безопасности в указанной папке и явно разрешил пользователю, созданному IIS7 (IIS_IUSRS), чтение / записьпапку, и теперь файлы могут быть загружены. Кажется, что источник этих проблем тот же.

РЕДАКТИРОВАТЬ: Решение перенесено в ответ по предложению Уилла.

1 Ответ

2 голосов
/ 11 января 2011

Хорошо, ребята, решение найдено, и, как рекомендует Уилл, я опубликую его здесь, как ответ на мой собственный вопрос. Итак, решение:

Проблема заключалась в том, что поток, созданный веб-методом, должен быть олицетворен. Итак, в методе вызова я должен был что-то вроде:

[WebMethod]
public void Fnc()
{
    ...
    ...
    System.Security.Principal.WindowsIdentity wi =    System.Security.Principal.WindowsIdentity.GetCurrent();
    System.Threading.Thread postJobThread = new Thread(PostJobThread);
    postJobThread.Start(wi);
    ...
}

...

private void PostJobThread(object ob)
{
    System.Security.Principal.WindowsIdentity wi = (System.Security.Principal.WindowsIdentity)ob;
    System.Security.Principal.WindowsImpersonationContext ctx = wi.Impersonate();

    ...
    // Do some job which couldn't be done in this thread
    ...
    // OK, job is finished
    if(ctx != null)
    ctx.Undo();
}

Вот и все. Спасибо ребятам, которые прокомментировали мой вопрос, и я надеюсь, что он будет полезен для кого-то еще.

...