Программная регистрация события TFS 2010 + ошибка HTTP-кода 415: не удается обработать сообщение, поскольку содержимое

я хочу использовать регистрацию событий tfs для считывания событий BuildQualityChanged и WorkItemChanged. Это работало несколько месяцев назад, теперь я получаю следующую ошибку при получении события xml:

HTTP-код 415: не удается обработать сообщение, так как тип содержимого «application/soap+xml; charset=utf-8» не был ожидаемым типом «text/xml; кодировка=utf-8'. ---> System.Net.WebException: Удаленный сервер возвратил ошибку: (415) Невозможно обработать сообщение, поскольку тип содержимого '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 ломается с той же ошибкой. Мне было интересно, что версия SOAP в WSDL с использованием BasicHttpBinding также является SOAP 1.2. SetBinding() для использования BasicHttpBinding

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/soap+xml, а не application/xml

Может ли кто-нибудь сказать мне, где мой мозг идет не так?

Майкл


person Michael Baarz    schedule 06.02.2012    source источник


Ответы (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());

МАГИЯ, ЭТО РАБОТАЕТ :)

person Michael Baarz    schedule 08.02.2012