【问题标题】:wcf - 400 bad request when host in IISwcf - 在 IIS 中托管时出现 400 错误请求
【发布时间】:2014-01-12 11:02:52
【问题描述】:

我发现了很多类似问题的问题,但找不到解决方案。就我而言,我编写了 wcf 休息服务,然后创建了客户端应用程序并进行了连接。 (在本地主机中),然后它连接并正常工作。 之后,我在 IIS 中托管我的 wcf 服务并将我的客户端应用程序更改为 IIS 链接。然后它给了我以下错误。

The remote server returned an unexpected response: (400) Bad Request.

Server stack trace: 
   at System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory`1 factory, WebException responseException, ChannelBinding channelBinding)
   at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)

我的网络配置如下:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <clear />
    <add name="LibraryMgtSysEntities" connectionString="metadata=res://*/DataLibraryMgtSys.csdl|res://*/DataLibraryMgtSys.ssdl|res://*/DataLibraryMgtSys.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=tt\SQLEXPRESS;initial catalog=LibraryMgtSys;Persist Security Info=True;user id=sa;password=testing;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
    <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=tt\SQLEXPRESS;          Initial Catalog=LibraryMgtSys;          Integrated Security=SSPI;          user id=sa;password=testing;" />
  </connectionStrings>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <membership defaultProvider="SqlMembershipProvider" userIsOnlineTimeWindow="15">
      <providers>
        <clear />
        <add name="SqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="DefaultConnection" applicationName="LibraryMgtSys" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" passwordFormat="Hashed" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" />
      </providers>
    </membership>
    <sessionState mode="InProc" customProvider="DefaultSessionProvider">
      <providers>
        <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
      </providers>
    </sessionState>
    <roleManager enabled="true" defaultProvider="SqlRoleProvider">
      <providers>
        <clear />
        <add connectionStringName="DefaultConnection" applicationName="LibraryMgtSys" name="SqlRoleProvider" type="System.Web.Security.SqlRoleProvider" />
      </providers>
    </roleManager>
    <profile enabled="true">
      <providers>
        <clear />
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="DefaultConnection" applicationName="LibraryMgtSys" />
      </providers>
    </profile>
  </system.web>

  <system.serviceModel>
    <services>
      <service behaviorConfiguration="ServiceBehaviour" name="LibraryManagementService.MobileService">
        <endpoint address="" behaviorConfiguration="web" binding="webHttpBinding"
        contract="LibraryManagementService.IMobileService" />
      </service>

    </services>

    <bindings>
    </bindings>

    <behaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviour">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>

      </serviceBehaviors>
    </behaviors>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>  
    <directoryBrowse enabled="true"/>
  </system.webServer>

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>

我在这里想念什么?

【问题讨论】:

  • 您的端点没有指定地址。您需要为您的服务提供一个基地址并提供一个端点地址。在客户端,您需要指定基地址/端点地址。
  • @Saranya - IIS 提供基地址。如果端点中没有提供地址,则将使用基地址(在本例中为 .svc 文件的位置)。
  • @DevT 您是否通过从 IIS 打开服务来检查服务?
  • @ShujaatSiddiqui - 是的,当我从 iis 打开它时,它可以完美运行。

标签: c# wcf rest iis wcf-binding


【解决方案1】:

400 bad request 是指发送的请求不遵守 HTTP 协议,格式不正确。 正如您所说,在将其托管在 IIS 上之前它工作正常。

  1. 如果它的其余 GET api 只是将 url 粘贴到浏览器上并检查它是否工作正常?
  2. 如果是,则表示您的客户端应用程序有问题
  3. 如果否,那么我建议您检查服务合同/或者您没有在 IIS 上正确托管服务。

【讨论】:

    【解决方案2】:

    我发现这个问题是因为数据库连接问题。当我在 IIS 中托管我的 Web 服务时,它需要为 IIS 用户授予对数据库的访问权限。我按照answer 中的说明配置数据库设置

    【讨论】:

      猜你喜欢
      • 2014-03-18
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 2011-01-10
      • 2020-04-20
      • 2020-10-12
      • 1970-01-01
      相关资源
      最近更新 更多