2010-05-20 8 views
1

J'essaie de créer un service Web qui manipule les requêtes HTTP POST et GET.Déploiement d'un service Web HttpHandler

Voici un exemple:

public class CodebookHttpHandler: IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     if (context.Request.HttpMethod == "POST") 
     { 
      //DoHttpPostLogic(); 
     } 
     else if (context.Request.HttpMethod == "GET") 
     { 
      //DoHttpGetLogic(); 
     } 
    } 
... 

public void DoHttpPostLogic() 
{ 
... 
} 
public void DoHttpGetLogic() 
{ 
... 
} 

je dois déployer cela, mais je me bats comment commencer. La plupart des références en ligne montrent la fabrication d'un site Web, mais vraiment, tout ce que je veux faire est de répondre quand un HttpPost est envoyé. Je ne sais pas quoi mettre sur le site, je veux juste que ce code fonctionne.

Edit: Je suivais le site this comme exactement ce que je suis en train de faire.

J'ai le site Web mis en place, j'ai le code pour le gestionnaire dans un fichier .cs, j'ai édité le web.config pour ajouter le gestionnaire pour l'extension de fichier dont j'ai besoin. Maintenant, je suis à l'étape 3 où vous dites IIS à propos de cette extension et le mapper à ASP.NET. Aussi j'utilise IIS 7 donc l'interface est légèrement différente des captures d'écran. Ceci est le problème que j'ai:

1) Go to website 
2) Go to handler mappings 
3) Go Add Script Map 
4) request path - put the extension I want to handle 
5) Executable- it seems i am told to set aspnet_isapi.dll here. Maybe this is incorrect? 
6) Give name 
7) Hit OK button: 

Ajouter un script Carte

Est-ce que vous souhaitez autoriser cette extension ISAPI? Cliquez sur "Oui" pour ajouter l'extension avec une entrée "Autorisée" à la liste des restrictions ISAPI et CGI ou pour mettre à jour une entrée d'extension existante à "Autorisé" dans la liste des restrictions ISAPI et CGI.

Oui Non Annuler


8) Hit Yes 

Ajouter un script Carte

Le module spécifié requis par ce gestionnaire n'est pas dans la liste des modules. Si vous ajoutez un mappage de gestionnaire de mappage de script, le module IsapiModule ou CgiModule doit figurer dans la liste des modules.

OK


modifier 2: Je viens juste compris que ce gestionnaire géré avait quelque chose à voir avec les gestionnaires Witten en code managé, carte de script était d'aider la configuration d'un exécutable et la cartographie module travailler avec des modules http. Donc, je devrais utiliser l'option 1 - Ajouter un gestionnaire géré.

Voir:

http://img37.imageshack.us/img37/8350/managedhandler.png

http://yfrog.com/11managedhandlerp

Je sais ce que mon chemin de requête est pour l'extension de fichier ... et je sais que le nom (peut appeler ce que je veux), donc il faut être le champ Type avec lequel je me bats. Dans le dossier des applications (dans IIS) jusqu'ici j'ai juste le MyHandler.cs et web.config (Bien sûr aussi un fichier avec l'extension que j'essaye de créer le gestionnaire pour!)

EDIT3: progrès

Alors maintenant, j'ai le code et le web.config mis en place, je test pour voir si je peux accéder au fichier de filename.CustomExtension:

Erreur HTTP 404.3 - Non trouvé La page que vous demandez ne peut pas être diffusée en raison de la configuration de l'extension. Si la page est un script, ajoutez un gestionnaire . Si le fichier doit être téléchargé, ajoutez une carte MIME.

Donc IIS7 je vais à Mappages et l'ajouter à See this MSDN example, it is exactly what I am trying to follow

La classe ressemble à ceci:.

using System.Web; 

namespace HandlerAttempt2 
{ 
    public class MyHandler : IHttpHandler 
    { 
     public MyHandler() 
     { 
      //TODO: Add constructor logic here 
     } 

     public void ProcessRequest(HttpContext context) 
     { 
      var objResponse = context.Response; 
      objResponse.Write("<html><body><h1>It just worked"); 
      objResponse.Write("</body></html>"); 
     } 

     public bool IsReusable 
     { 
      get 
      { 
       return true; 
      } 
     } 

    } 
} 

ajouter le gestionnaire de la façon suivante:

Demande chemin: *.whatever Type: MyHandler (nom de la classe - cela semble correct selon l'exemple!) Nom: whatever

Essayez de parcourir le nouveau fichier personnalisé (ce qui est dans la piscine d'application comme intégrée):

Erreur HTTP 500,21 - Erreur interne du serveur gestionnaire « whatever » a un mauvais module « ManagedPipelineHandler » dans sa liste des modules

Essayez de parcourir le nouveau fichier personnalisé (ce qui est dans la piscine app comme CLASSIC):

erreur HTTP 404.17 - Not Found le contenu demandé semble être le script et ne sera pas servi par le gestionnaire de fichiers statique.

Questions directes

1) Est-ce que le site doit être en mode classique ou intégré? Je ne trouve aucune référence de ceci dans le matériel en ligne, que ce soit ou non.

2) Dois-je compiler MyHandler.cs en .dll, ou puis-je simplement le laisser en .cs? A-t-il besoin d'être dans un dossier bin, ou juste n'importe où dans la racine?

+0

Quelle version de .NET utilisez-vous? –

+0

@John Saunders 3.5 SP1 Je suis assez sûr ... pourquoi est-ce important? – baron

+0

vous ne savez jamais. –

Répondre

2

RE vos questions:

Je ne connais pas la réponse à la première (CLASSIC ou intégré); mais je peux aider avec la deuxième ...

Oui, vous aurez besoin de le compiler en premier. Je n'ai jamais essayé de déployer des DLLs ailleurs qu'à la poubelle, étant donné que c'est la norme que je soupçonnerais de les placer ailleurs, même si cela fonctionnait.

La façon dont je déploie HttpHandlers est très simple - tout le travail accompli dans web.config, je devais aller dans IIS pour changer les paramètres. Pour commencer, pour que la requête http soit gérée par ASP.NET, vous devez utiliser un suffixe de requête qui est déjà redirigé vers ASP.NET - comme .aspx ou ashx.Si vous voulez utiliser quelque chose d'autre, vous devrez configurer IIS pour ce faire, conformément à votre gestionnaire img ci-dessus.

J'ai tendance à utiliser .ashx par exemple: http://localhost/foo/my/httphandler/does/this.ashx

Tout ce que vous devez faire (en supposant que vous avez compilé athe HttpHandler dans une DLL et déploiement à l'échelle du site) est d'ajouter la configuration nécessaire.

<configuration> 
    <system.web> 
     <httpHandlers> 
      <add verb="*" 
       path="*.ashx" 
       type="MyApp.PublishingSystem.HttpHandlers.GroovyHandler, MyApp.PublishingSystem" /> 
     </httpHandlers> 
    </system.web> 
</configuration> 

Évidemment, vous pouvez modifier/limiter la portée à l'aide du chemin, par exemple (?):

path="*.ashx" 
path="*ListWidgets.ashx" 
path="*Admin/ListWidgets.ashx" 

Plus d'infos ici: http://msdn.microsoft.com/en-us/library/ms820032.aspx

Un Gotcha important de surveiller est l'ordre dans lequel vous déclarez vos HttpHandlers dans la config; de ce dont je me souviens, ceux qui ont été déclarés premiers ont pris un précédent. Donc, dans cet exemple ...

<add verb="*" path="*foo.ashx" type="MyApp.PublishingSystem.HttpHandlers.FooHandler, MyApp.PublishingSystem" /> 
<add verb="*" path="*.ashx" type="MyApp.PublishingSystem.HttpHandlers.GroovyHandler, MyApp.PublishingSystem" /> 

... le gestionnaire groovy se chargera tous HttpRequests sauf toutes celles qui se terminent par foo.ashx

D'ailleurs, je fais usage de HttpHanldrs dans mon open source .net cadre CMS/app, vous trouverez peut-être un code utile là-bas (?): http://morphfolia.codeplex.com/

+0

J'ai fini par résoudre cela moi-même, mais c'est la réponse détaillée parfaite dont j'avais besoin. J'espère que cela aidera quelqu'un d'autre, merci de poster. (Oh et je n'ai jamais confirmé, mais je pense que classique est pour configurer IIS 6 et les sites ci-dessous dans IIS7) – baron

1

Assurez-vous que le cadre de pool d'application .NET version est correctement réglée ...

J'ai déployé une application Web .NET 4.0 sur un pool d'applications .NET 2.0 et j'ai obtenu cette erreur. Définir le pool d'applications à v4.X et le ashx a été servi comme un champion.

Questions connexes