Programmatic 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
Может кто-нибудь сказать мне, где мой мозг работает неправильно?
Майкл
1 ответ
После нескольких часов поиска я не нашел никакого решения. Компьютерщик Microsoft помогает мне избавиться от него:
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());
МАГИЯ, ЭТО РАБОТАЕТ:)