2

我想使用 tfs 事件注册来读出 BuildQualityChanged 和 WorkItemChanged 事件。它在一个月前工作,现在我在获取事件 xml 时收到以下错误:

HTTP 代码 415:无法处理消息,因为内容类型为 'application/soap+xml; charset=utf-8' 不是预期的类型 'text/xml; 字符集=utf-8'。---> System.Net.WebException: The remote server returned an error: (415) Cannot processing the message because the content type 'application/soap+xml; charset=utf-8' 不是预期的类型 'text/xml; 字符集=utf-8'..

我正在构建一个控制台应用程序,该应用程序稍后将成为 Windows 服务。托管 wcf 服务的代码如下:

private void HostWcfService()
{
    D_("Hosting WCF service");
    var serviceUri = new Uri(GetCorrectServiceAddress());
    _host = new ServiceHost(typeof(BuildQualityChanged), new []{serviceUri});
    AddBehaviors(_host);
    SetBinding(_host, serviceUri);
    _host.Open();
}

private static void AddBehaviors(ServiceHost service)
{
    var smb = service.Description.Behaviors.Find<ServiceMetadataBehavior>();
    if (smb == null)
    {
        smb = new ServiceMetadataBehavior();
        service.Description.Behaviors.Add(smb);
    }
    smb.HttpGetEnabled = true;

    var sdb = service.Description.Behaviors.Find<ServiceDebugBehavior>();
    if (sdb == null)
    {
        sdb = new ServiceDebugBehavior();
        service.Description.Behaviors.Add(sdb);
    }
    sdb.IncludeExceptionDetailInFaults = true;
}

private void SetBinding(ServiceHost _host, Uri serviceUri)
{
    // create and configure an MTOM encoder
    var mtom =
        new TextMessageEncodingBindingElement(
            MessageVersion.Soap11, Encoding.UTF8);

    // create a CustomBinding using MTOM encoder
    CustomBinding binding = new CustomBinding();
    binding.Elements.Add(mtom);
    binding.Elements.Add(
        new HttpTransportBindingElement());
    _host.AddServiceEndpoint(typeof(TFS.Build.ITeamFoundationEventSubscriber),
        binding, serviceUri);
}

到目前为止,我发现的所有带有此错误的解决方案都会在 web.config 中配置服务,这对我来说是不可能的解决方案,我必须以编程方式托管。我发现的第二个解决方案是使用 BasicHttpBinding 而不是 CustomBinding,但这对我来说也不起作用,tfs 会因同样的错误而中断。我想知道使用 BasicHttpBinding 的 WSDL 中的 SOAP 版本也是 SOAP 1.2。使用 BasicHttpBinding 的 SetBinding() 是

var binding1 = new BasicHttpBinding();
            binding1.Name = "binding1";
            binding1.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
            binding1.Security.Mode = BasicHttpSecurityMode.None;
            _host.AddServiceEndpoint(typeof(TFS.Build.ITeamFoundationEventSubscriber), binding1, serviceUri);

required 和 given request 的唯一区别是内容类型,我需要 application/soap+xml 而不是 application/xml

谁能告诉我我的大脑哪里出了问题?

迈克尔

4

1 回答 1

1

经过数小时的搜索,我没有找到任何解决方案。微软的极客帮我摆脱它:

TFS2010 只支持 wsHttpBinding 没有安全性

我的 SetBinding() 方法的内容现在如下:

var binding1 = new WSHttpBinding();
binding1.Name = "binding1";
binding1.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
binding1.Security.Mode = SecurityMode.None;
_host.AddServiceEndpoint(typeof(TFS.Build.ITeamFoundationEventSubscriber), binding1, GetCorrectServiceAddress());

神奇,它有效:)

于 2012-02-08T13:14:42.983 回答