WCF:自托管服务上的 HTTP 400 错误请求

Posted

技术标签:

【中文标题】WCF:自托管服务上的 HTTP 400 错误请求【英文标题】:WCF: HTTP 400 Bad Request on self hosted service 【发布时间】:2012-01-14 13:44:51 【问题描述】:

我有这个界面:

  [ServiceContract]
    public interface ILocationService
    
        [OperationContract]
        bool RegisterForNotification(string name, string uri);

        [OperationContract]
        bool UnRegisterForNotification(string name);
    

还有这项服务:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
    public class LocationBasedService : ILocationService
    
        #region Registrations
        public bool RegisterForNotification(string name, string uri)
        
            return true;
        

        public bool UnRegisterForNotification(string name)
        
            return true;
             
        #endregion
    

还有如下配置:

<configuration>
  <system.serviceModel>
    <services>
      <service name="PushNotifications.Server.Service.LocationBasedService" >
        <endpoint address="http://localhost:8000/LocationBasedService"
                 binding="basicHttpBinding"                 
                 contract="Services.Interface.ILocationService"/>
      </service>      
    </services>
  </system.serviceModel>

使用 ServiceHost 在 WPF 应用程序中自行托管。代码如下:

private void startSrv_Click(object sender, RoutedEventArgs e)
        
            try 
            
                host = new ServiceHost(typeof(LocationBasedService));
                host.Open();
                AddDiagnosticMessage("service successfully initialized");
                AddDiagnosticMessage(string.Format("0 is up and running with these end points", host.Description.ServiceType));
                foreach (var se in host.Description.Endpoints)
                    AddDiagnosticMessage(se.Address.ToString());
            
            catch (TimeoutException ex)
            
                AddDiagnosticMessage(string.Format("The service operation timeod out. 0", ex));
            
            catch (CommunicationException ex)
            
                AddDiagnosticMessage(string.Format("Could not start host service. 0", ex));
            
            catch (Exception ex)
            
                AddDiagnosticMessage(ex.Message);
                              
        

服务无异常启动。但是,当我将 url http://localhost:8000/LocationBasedService 提交到浏览器时,我收到 HTTP 400 Bad Request。如果我尝试使用 Visual Studio 的添加服务引用创建 WCF 客户端,则会收到以下错误:

'http://localhost:8000/LocationBasedService'。 内容类型应用程序/soap+xml;服务 http://localhost:8000/LocationBasedService 不支持 charset=utf-8。客户端和服务绑定可能不匹配。 远程服务器返回错误:(415)无法处理消息,因为内容类型'application/soap+xml; charset=utf-8' 不是预期的类型 'text/xml;字符集=utf-8'.. 如果在当前解决方案中定义了服务,请尝试构建解决方案并再次添加服务引用。

如果我尝试使用以下代码调用客户端,则会收到超时异常。

 private void Button_Click(object sender, RoutedEventArgs e)
        
            statusMessages.Add(GetFormattedMessage("initiailing client proxy"));
            var ep = new EndpointAddress("http://localhost:8000/LocationBasedService");
                     var proxy = ChannelFactory<ILocationService>.CreateChannel(new BasicHttpBinding(), ep);          
            var register = proxy.RegisterForNotification("name1", @"http://google.com");
            if (register)
              Console.Writeline(register.ToString()); 
        

有人可以就我错过的内容提供一些见解。这应该是一个简单的练习:!

TIA。

【问题讨论】:

我通过添加 ServiceMetaData 行为在查看元数据方面取得了一些进展,但仍然无法让服务在没有超时的情况下响应简单的客户端请求。这都是默认的 BasicHttpBindings。 【参考方案1】:

通过添加以下代码解决了错误的 HTTP 请求:

 host = new ServiceHost(typeof(LocationBasedService), new Uri("http://localhost:8000/LocationBasedService"));

  // Enable metadata publishing.
   ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
   smb.HttpGetEnabled = true;
   smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
   host.Description.Behaviors.Add(smb);

    host.Open();   

至于服务超时,这是我个人防火墙造成的。我必须将 Visual Studio 添加到允许的应用程序列表中。

重新开始营业。

【讨论】:

说得太快了。测试 WCF 客户端工作,但通过代码,我无法超过超时。 但是,如果我从另一个解决方案(Visual Studio Express 的另一个实例)运行我的客户端,它可以正常工作。之前,我在与服务主机代码相同的 WPF 应用程序中使用客户端测试代码,两者都使用相同的 app.config。

以上是关于WCF:自托管服务上的 HTTP 400 错误请求的主要内容,如果未能解决你的问题,请参考以下文章

wcf 服务错误请求 400 流式传输

从 JQuery 调用 WCF 服务:跨域 OPTIONS 请求给出错误 400

使用管理员以外的其他用户调用 WCF 服务时响应 400(错误请求)

自托管 WCF 服务中的 HTTP 413 请求实体太大

使用 GET 访问 WCF 休息服务时出现 400 http 错误请求错误

大型 WCF Web 服务请求因 (400) HTTP 错误请求而失败