2009-12-12 5 views
2

Désolé d'avoir posé une question à propos de quelque chose que je ne connais pas beaucoup, mais je me suis arraché les cheveux en essayant de faire fonctionner ça. Donc, j'ai un service WCF qui est hébergé sur IIS et semble fonctionner dans la mesure où je peux le "voir" sur le réseau en passant par http://servername/MyService.svc dans un navigateur.Abonnement aux événements TFS et WCF

Ce .svc ressemble à:

<% @ServiceHost Service="Foo.Bar" %> 

Le code correspondant ressemble à:

[ServiceContract(Namespace = "http://schemas.microsoft.com/TeamFoundation/2005/06Services/Notification/03")] 
    public interface IBar 
    { 
     [OperationContract(Action = "http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03/Notify", ReplyAction = "*")] 
     [XmlSerializerFormat(Style = OperationFormatStyle.Document)] 
     void Notify(string eventXml, string tfsIdentityXml); 
    } 

et:

public class Bar : IBar 
{ 
    public void Notify(string eventXml, string tfsIdentityXml) 
    { 
     // Just some test output to see if it worked 
     var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "tfs.txt"); 
     File.WriteAllText(path, tfsIdentityXml + eventXml); 
    } 
} 

Ce tout a été construit et qui a suivi .dll mis en le répertoire bin dans la racine du site dans IIS.

Je souhaite maintenant m'abonner via bissubscribe.exe (ou une méthode similaire) aux événements d'enregistrement TFS. J'ai essayé de faire quelque chose comme:

bissubscribe /eventType CheckinEvent 
    /address http://servername/MyService.svc 
    /deliveryType Soap 
    /server mytfsserver 

Mais rien; il ne ressemble même pas à une activité de journalisation. Donc, en gardant à l'esprit que je ne sais rien à propos de la WCF, qu'est-ce que je fais de mal? J'imagine que le address param est une chose; ne suis-je pas censé le pointer vers le .svc?

Répondre

1

Un point qui saute est le fait que vous avez une méthode qui ne renvoie rien sauf void. Celles-ci devraient être marqués comme méthode "à sens unique" dans WCF:

[ServiceContract(Namespace = "http://schemas.microsoft.com/TeamFoundation/2005/06Services/Notification/03")] 
public interface IBar 
{ 
    [OperationContract(Action = "http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03/Notify", ReplyAction = "*", IsOneWay=true)] 
    [XmlSerializerFormat(Style = OperationFormatStyle.Document)] 
    void Notify(string eventXml, string tfsIdentityXml); 
} 

Ajouter le "IsOneWay = true" à votre attribut [OperationContract]. En dehors de cela, il n'y a rien d'anormal dans votre code, mais pour le dire vraiment, nous aurions besoin de beaucoup plus d'informations de configuration pour le dire. Essayez d'abord le IsOneWay=true et voyez si cela résout votre problème.

+0

D'accord, je peux le faire - mais plus que tout, je suis curieux de savoir ce qu'est "l'URL" de mon service. Je sais que c'est une question stupide, mais est-ce que c'est celui que j'ai posté (le .svc) la bonne façon pour les clients d'y accéder? Ou comment cela se fait-il généralement? –

+1

Ah okay - désolé, n'a pas attrapé cette partie de la question :-) Lors de l'hébergement dans IIS, l'URL du service est défini par le serveur (et éventuellement un port), le répertoire virtuel et sous-répertoires possibles sous lequel le * .svc file lives, et le nom et l'extension du fichier svc lui-même. Donc, ce serait quelque chose comme 'http: // votre serveur: 8088/virtualdir/subdir/yourservice.svc' –

+0

Ajoutez à cette adresse toute« adresse »relative que vous auriez pu définir dans votre fichier de configuration de service (le web.config du site, dans la section ' ....' –

1

Comment votre service est-il configuré? En particulier, est-il configuré pour utiliser basicHttpBinding? Essayez de créer un client pour appeler votre service afin de vous assurer qu'il peut être appelé. Puis, regardez s'il existe un exemple de service du TFS SDK - voyez si vous pouvez obtenir l'exemple pour fonctionner.

+0

Les exemples TFS pour notifier les services semblent pointer vers un fichier .asmx, ce que je n'ai pas.Je suppose que ce n'est pas WCF, quel est l'équivalent? –

+0

Avez-vous l'exemple de fichier ASMX? C'est ce que je veux que vous utilisiez, pour diagnostiquer où se trouve le problème –

1

j'ai pu terminer cette connexion avec les éléments suivants:

[ServiceContract(Namespace = "http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03")] 
public interface ITeamSystemObserver : IObservable 
{ 
    [OperationContract(Action = "http://schemas.microsoft.com/TeamFoundation/2005/06/Services/Notification/03/Notify", ReplyAction = "*")] 
    [XmlSerializerFormat(Style=OperationFormatStyle.Document)] 
    void Notify(string eventXml, string tfsIdentityXml, SubscriptionInfo SubscriptionInfo); 
} 

Notez que vous manquez le paramètre SubscriptionInfo. Voici mon web.config:

<basicHttpBinding> 
    <binding name="TfsEventServiceBasic"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Ntlm" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
+0

Merci, j'ai ajouté ces changements.J'obtiens toujours une erreur HTTP 405 de BisSubscribe.exe cependant, pour certains raison –

2

Les configurations TFS 2010 et WCF 4.0 sont décrites ci-dessous ...

signature de la méthode:

public void Notify(string eventXml) /* No SubscriptionInfo! */ 

config Web:

<configuration> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0"> 
     <assemblies> 
     <add assembly="Microsoft.TeamFoundation, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/> 
     </assemblies> 
    </compilation> 
    </system.web> 
    <system.serviceModel> 
    <services> 
     <service behaviorConfiguration="NotificationServiceBehavior" name="TF.CheckinListener.CheckinListener"> 
     <endpoint address="Notify" binding="wsHttpBinding" bindingConfiguration="noSecurity" contract="TF.CheckinListener.ICheckinListener" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="NotificationServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
    </binding> 
     <wsHttpBinding> 
     <binding name="noSecurity" maxBufferPoolSize="20000000" maxReceivedMessageSize="200000000"> 
     <readerQuotas maxStringContentLength="200000000" maxArrayLength="200000000" /> 
     <security mode="None" /> 
    </bindings> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
</configuration> 

Abonnement Adresse pour bissubscribe:

http://MachineName/VirtualDirectoryName/Service.svc/notify

Questions connexes