2

BuildQualityChanged および WorkItemChanged イベントの読み取りに tfs イベント登録を使用したいと考えています。数か月前は機能していましたが、イベント xml の取得中に次のエラーが発生しました。

HTTP コード 415: コンテンツ タイプが 'application/soap+xml; であるため、メッセージを処理できません。charset=utf-8' は予期されたタイプの 'text/xml ではありませんでした。charset=utf-8'. ---> System.Net.WebException: リモート サーバーがエラーを返しました: (415) コンテンツ タイプが 'application/soap+xml; であるため、メッセージを処理できません。charset=utf-8' は予期されたタイプの 'text/xml ではありませんでした。charset=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でサービスを構成します。これは私にとって可能な解決策ではありません。プログラムでホストする必要があります。私が見つけた2番目の解決策は、CustomBindingではなくBasicHttpBindingを使用することですが、これは私にはうまくいきません.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);

必要なリクエストと指定されたリクエストの唯一の違いはコンテンツ タイプです。application/xml ではなく application/soap+xml が必要です

私の脳のどこが間違っているのか誰か教えてくれませんか?

マイケル

4

1 に答える 1

1

何時間も検索した後、解決策が見つかりませんでした。マイクロソフトのオタクは、私がそれを取り除くのを手伝ってくれます:

TFS2010 は、セキュリティなしで wHttpBinding のみをサポートします

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 に答える