我想使用 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
谁能告诉我我的大脑哪里出了问题?
迈克尔