2010-12-30 2 views
3

Il existe un service Windows sur Windows Server 2003 (machine virtuelle Amazon). Certaines applications peuvent communiquer avec lui (en utilisant des pipes, mais il y a un wrapper pour le faire). Il est testé et cela fonctionne. En outre, il existe un service Web écrit en C# (ASP.NET) qui communique avec le service Windows mentionné. Lorsque Web Method est appelée, elle crée une instance de la classe et appelle une fonction - la fonction "se connecte" au service Windows et y envoie un travail. Mais, si à l'intérieur de la méthode Web est créé un thread et la fonction qui "se connecte" au service Windows est appelée à l'intérieur d'un thread - la connexion échoue. La connexion au service Windows utilise des canaux. Le service Web fonctionne sur IIS7. Il convient de mentionner que tout fonctionne sur ma machine locale, soit à partir du débogueur (serveur local démarré par VS 2010) ou à partir d'Internet Explorer lorsque j'appelle Web Method sur Web Service qui fonctionne sur IIS7 local. Dans local tous les travaux - mais sur Amazon Instance ne fonctionne pas. Je ne suis pas un programmeur web, donc je pense qu'il y a un problème avec la sécurité. Un indice? Merci.Problème du service Web ASMX lors de la communication avec le service Windows dans un thread séparé

EDIT: Commentaire de Uwe m'a rappelé - la méthode Web essaie d'abord de télécharger des fichiers en utilisant http et il les enregistre au chemin C: \ intetpub \ wwwroot \ fichiers \ » Il ne fonctionne que si les fichiers sont téléchargés à partir de la méthode Web. , mais le téléchargement échoue si elle est effectuée à partir d'un autre thread créé dans Web Method.Exception: Accès refusé.J'ai modifié les paramètres de sécurité du dossier mentionné et explicitement autorisé utilisateur créé par IIS7 (IIS_IUSRS) pour lire/écrire le dossier, et . maintenant les fichiers peuvent être téléchargés Il semble que la source de ces problèmes est la même

EDIT:.. la solution est déplacée à une réponse à la suggestion de Will

+0

Pouvez-vous publier des détails, comment la "connexion échoue" se comporte réellement? C'est à dire. message d'erreur détaillé, trace de la pile, comportement, etc. –

+1

L'échec de la connexion n'est pas pertinent, puisque la "connexion" est un appel de fonction. Le problème est: Je peux communiquer au service Windows à partir du service Web, si la communication provient du même thread dans lequel exécute la méthode Web; si la méthode Web crée un nouveau thread, la communication échoue. Je n'ai plus de détails reçus du service Windows mentionné. Comme il fonctionne à partir du même thread sur Amazon Virtual Machine, et non si les threads sont différents, et aussi qu'il fonctionne sur mon ordinateur local même avec des threads différents, je pensais que c'était quelque chose lié à la sécurité ou aux permissions. Merci. – Vladimir

+1

@Vladimir: si la manière dont la connexion échoue n'est pas pertinente, pourquoi ne pas prétendre qu'elle ne va pas du tout? Bien sûr, c'est pertinent. –

Répondre

2

Ok les gars, la solution est trouvée et que Je recommanderai, je l'afficherai ici, comme une réponse à ma propre question. Ainsi, la solution:

Le problème était dû au fait que le thread créé par Web Method devait être emprunté. Donc, dans la méthode de l'appelant, je devais quelque chose comme:

[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(); 
} 

C'est tout. Merci aux gars qui ont commenté ma question et j'espère que ce sera utile pour quelqu'un d'autre.

Questions connexes