代码之家  ›  专栏  ›  技术社区  ›  J Cooper

订阅TFS事件和WCF

  •  3
  • J Cooper  · 技术社区  · 15 年前

    很抱歉问了一个我不太了解的问题,但我一直在努力使这个工作顺利进行。

    因此,我有一个WCF服务,它托管在IIS上,并且似乎工作得很好,我可以通过访问 http://servername/MyService.svc 在浏览器中。

    svc看起来像:

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

    相关代码如下:

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

    还有:

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

    所有这些都已经构建好了,随后的.dll被放到了IIS中站点根目录的bin目录中。

    我现在想通过bissubscribe.exe(或类似的方法)订阅TFS签入事件。我试着做了如下的事情:

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

    但什么都没有,它甚至不像日志活动。所以记住,我对WCF一无所知,我做错了什么?我想象 address 参数是一回事,我不应该把它指向.svc吗?

    5 回复  |  直到 14 年前
        1
  •  3
  •   Ewald Hofman    14 年前

    我创建了一篇博客文章,介绍如何将WCF与TFS的事件服务结合使用: http://www.ewaldhofman.nl/post/2010/08/02/How-to-use-WCF-to-subscribe-to-the-TFS-2010-Event-Service-rolling-up-hours.aspx

        2
  •  2
  •   Cicekfidan    14 年前

    下面介绍了TFS 2010和WCF 4.0配置…

    方法签名:

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

    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>
    

    Bissubscribe的订阅地址:

    http://MachineName/VirtualDirectoryName/Service.svc /通知

        3
  •  1
  •   marc_s Anurag    15 年前

    有一点很明显,你有一个方法除了 void . 在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);
    }
    

    将“isoneway=true”添加到 [OperationContract] 属性。

    除此之外,代码中没有明显的错误,但要真正说明这一点,我们需要更多的配置信息才能真正说明这一点。试试 IsOneWay=true 首先,看看这是否解决了你的问题。

        4
  •  1
  •   John Saunders    15 年前

    您的服务是如何配置的?特别是,它是否配置为使用 basicHttpBinding 是吗?

    尝试创建一个客户端来调用您的服务,以确保可以调用它。

    然后,看看是否有一个来自TFSDK的示例服务——看看您是否可以让这个示例工作。

        5
  •  1
  •   Adam Fyles    15 年前

    我可以通过以下方式完成此连接:

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

    注意,您缺少subscriptionInfo参数。这是我的web.config:

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