WCF服务客户端:内容类型为text / html;响应消息的charset = utf-8与绑定的内容类型不匹配


73

我在本地IIS服务器上运行了WCF服务。我已将其添加为对C#网站项目的服务引用,它可以很好地添加并自动生成代理类。

但是,当我尝试调用任何服务合同时,都会出现以下错误:

说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。

异常详细信息:System.ServiceModel.ProtocolException:内容类型text / html; 响应消息的charset = utf-8与绑定的内容类型不匹配(application / soap + xml; charset = utf-8)。如果使用自定义编码器,请确保正确实施IsContentTypeSupported方法。响应的前1024个字节为:'函数bredir(d,u,r,v,c){var w,h,wd,hd,bi; var b = false; var p = false; var s = [[ 300,250,false],[250,250,false],[240,400,false],[336,280,false],[180,150,false],[468,60,false],[234,60,false],[88,31, false],[120,90,false],[120,60,false],[120,240,false],[125,125,false],[728,90,false],[160,600,false],[120,600,false] ,, [300,600,false],[300,125,false],[530,300,false],[190,200,false],[470,250,false],[720,300,true],[500,350,true],[550,480,true]]; if(typeof(window.innerHeight)=='数字'

我也有一个控制台应用程序,该应用程序也可以与WCF服务进行通信,并且该控制台应用程序可以很好地调用方法而不会出现此错误。

以下是我的配置文件的摘录。

WCF服务Web.Config:

<system.serviceModel>
   <services>
      <service name="ScraperService" behaviorConfiguration="ScraperServiceBehavior">
         <endpoint address=""
                   binding="wsHttpBinding" 
                   bindingConfiguration="WSHttpBinding_IScraperService"
                   contract="IScraperService" />
         <endpoint address="mex" 
                   binding="mexHttpBinding" 
                   contract="IMetadataExchange" />
         <host>
            <baseAddresses>
                <add baseAddress="http://example.com" />
            </baseAddresses>
         </host>
      </service>
   </services>
   <bindings>
       <wsHttpBinding>
           <binding name="WSHttpBinding_IScraperService"
                    bypassProxyOnLocal="false" transactionFlow="false"
                    hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="2000000" maxReceivedMessageSize="2000000"
                    messageEncoding="Text" textEncoding="utf-8"
                    useDefaultWebProxy="true" allowCookies="false">
               <readerQuotas 
                     maxDepth="2000000" maxStringContentLength="2000000" 
                     maxArrayLength="2000000" maxBytesPerRead="2000000"
                     maxNameTableCharCount="2000000" />
               <reliableSession 
                     enabled="false" ordered="true" inactivityTimeout="00:10:00" />
               <security mode="Message">
                   <message clientCredentialType="Windows"
                            negotiateServiceCredential="true"
                            algorithmSuite="Default"
                            establishSecurityContext="true" />
               </security>
            </binding>
          </wsHttpBinding>
      </bindings>
      <behaviors>
          <serviceBehaviors>
              <behavior name="ScraperServiceBehavior">
                  <serviceMetadata httpGetEnabled="true" />
                  <serviceDebug includeExceptionDetailInFaults="true" />
              </behavior>
          </serviceBehaviors>
     </behaviors>
</system.serviceModel>

网站项目服务客户Web.Config

<system.serviceModel>
   <bindings>
      <wsHttpBinding>
          <binding name="WSHttpBinding_IScraperService" 
              closeTimeout="00:01:00" openTimeout="00:01:00" 
              receiveTimeout="00:10:00" sendTimeout="00:01:00"
              bypassProxyOnLocal="false" transactionFlow="false" 
              hostNameComparisonMode="StrongWildcard"
              maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
              messageEncoding="Text" textEncoding="utf-8"
              useDefaultWebProxy="true" allowCookies="false">
              <readerQuotas 
                  maxDepth="32" maxStringContentLength="8192" 
                  maxArrayLength="16384" maxBytesPerRead="4096" 
                  maxNameTableCharCount="16384" />
              <reliableSession enabled="false"
                  ordered="true" inactivityTimeout="00:10:00" />
              <security mode="Message">
                  <transport clientCredentialType="Windows" 
                       proxyCredentialType="None" realm="" />
                  <message clientCredentialType="Windows" 
                       negotiateServiceCredential="true"
                       algorithmSuite="Default" />
              </security>
          </binding>
       </wsHttpBinding>
    </bindings>
<client>
        <endpoint name="WSHttpBinding_IScraperService"
            address="http://example.com/ScraperService.svc"
            binding="wsHttpBinding" 
            bindingConfiguration="WSHttpBinding_IScraperService"
            contract="ScraperService.IScraperService" >
           <identity>
               <servicePrincipalName value="host/FreshNET-II" />
           </identity>
        </endpoint>
     </client>
</system.serviceModel>

这是我第一次创建WCF的尝试,因此它非常新。任何帮助深表感谢。


1
您如何托管此服务?在IIS中 如果是这样,则IIS指示服务地址-您不能定义自己的基地址(不使用它们)。因此,如果您使用IIS,则地址为http://yourserver/virtualdirectory/ScrapperService.svc。您可以在Visual Studio的解决方案资源管理器中的* .svc文件上执行“在浏览器中查看”吗?
marc_s

1
我试图从IIS服务器查看该服务,但它返回了DNS错误。原来,该服务仅在内部可见,因此当我的客户端尝试访问该服务时,它就不可见。全部排序,谢谢!
丹·埃利斯

Answers:


30

尝试使用客户端通常在其下运行的相同Windows凭据在托管服务的服务器上的Web浏览器中浏览到http://localhost/ScraperService.svc

我想象IIS正在显示某个描述的html错误消息,而不是按预期返回xml。

当您具有执行Internet过滤的http代理服务器时,也会发生这种情况。我对ContentKeeper的经验是,它会拦截任何http / https流量并将其阻止为“非托管内容”-我们得到的只是一个html错误消息。为了避免这种情况,您可以将代理服务器例外规则添加到Internet Explorer,以使代理不会拦截到您网站的流量:

控制面板> Internet选项>连接>局域网设置>高级>代理设置

在此处输入图片说明


做到了。我登录到服务器并尝试查看服务,但收到DNS错误。事实证明,这些站点仅在内部可见,因此当我的WCF客户端尝试访问该服务时,该站点无法访问并返回错误。谢谢你的帮助!
丹·埃利斯

我没有使用代理服务器,但是这个答案促使我在上一个代理服务器对话框的“自动检测设置”中关闭了此功能
Michal Minich

你是救星!
寂寞的星球

28

我有一个类似的问题。我通过更改解决了

<basicHttpBinding>

<basicHttpsBinding>

并将我的网址更改为使用https://而不是http://。

同样在<endpoint>节点中,更改

binding="basicHttpBinding" 

binding="basicHttpsBinding"

这工作了。


这是给我的。提供程序从HTTP切换到HTTPS。
Scottie

那是我的问题,https而不是http。
艾哈迈德·萨米尔

这个答案为我省了很多麻烦。我必须使用接受绑定对象的SoapClient构造函数,并使用BasicHttpsBinding的实例。从来没有想过。
ForeverNoobie

18

来自Web服务器的HTML响应通常指示已提供错误页面,而不是来自WCF服务的响应。我的第一个建议是检查您正在其下运行WCF客户端的用户是否有权访问该资源。


1
我该如何进行测试?在测试过程中,WCF客户端和WCF服务都在同一IIS服务器上的不同域下运行...
Dan Ellis

WCF客户端是在IIS下运行的ASP.NET应用程序吗?如果是这样,它将可能以具有最小特权的网络服务帐户运行。您将需要允许该帐户访问IIS中的目录,或者将WCF客户端配置为作为其他Windows帐户运行。
DaveRead 2011年

如果WCF客户端是soapUI或WCFStorm等客户端测试工具,该怎么办?
VoodooChild

5

发生的情况是您正在尝试使用wsHttpBind访问服务,该服务默认使用安全的加密消息(安全消息)。另一方面,netTcpBind使用安全加密通道。(安全传输)...但是basicHttpBind,完全不需要任何安全性,并且可以访问匿名

所以。在服务器端,将其添加\更改为您的配置。

<bindings>
    <wsHttpBinding>
     <binding name="wsbind"> 
         <security mode="Message">
             <transport clientCredentialType="Windows" proxyCredentialType="None" />
             <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" establishSecurityContext="true" />
         </security>
     </binding>
    </wsHttpBinding>
</bindings>

然后将更改端点添加到

<endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsbind" name="wshttpbind" contract="WCFService.IService" > 

那应该做。



1

与许多人一样,在我的情况下,我也因为错误而得到了这个。可悲的是,我只能阅读html错误页面的CSS。

我的问题的根源也是服务器上的重写规则。它正在将HTTP重写为https。


1

您可能需要检查服务的配置,并确保一切正常。您可以通过浏览器导航到Web服务,以查看架构是否将在浏览器上呈现。

您可能还需要检查用于调用服务的凭据。


1

我尝试了以上所有建议,但最终有效的方法是将“应用程序池”管理的管道从“集成”模式更改为“经典”模式。
它运行在自己的应用程序池中-但它是第一个.NET 4.0服务-所有其他服务都使用集成管道模式在.NET 2.0上。它只是使用的标准WCF服务是https-但在Server 2008(不是R2)上-使用IIS 7(不是7.5)。


1

我也有类似的情况,但是客户端配置使用的是basicHttpBinding。问题出在该服务使用的是SOAP 1.2,而您不能在basicHttpBinding中指定SOAP 1.2。我修改了客户端配置,改用customBinding,一切正常。这是我的customBinding的详细信息,以供参考。我尝试使用的服务是使用UserNameOverTransport通过HTTPS进行的。

<customBinding>
    <binding name="myBindingNameHere" sendTimeout="00:03:00">
        <security authenticationMode="UserNameOverTransport" includeTimestamp="false">
            <secureConversationBootstrap />
        </security>
        <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
              messageVersion="Soap12" writeEncoding="utf-8">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </textMessageEncoding>
        <httpsTransport manualAddressing="false" maxBufferPoolSize="4194304"
              maxReceivedMessageSize="4194304" allowCookies="false" authenticationScheme="Basic"
              bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
              keepAliveEnabled="true" maxBufferSize="4194304" proxyAuthenticationScheme="Anonymous"
              realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
              useDefaultWebProxy="true" requireClientCertificate="false" />
    </binding>
</customBinding>

在哪里可以配置用户名和密码,它显示“未提供用户名。在ClientCredentials中指定用户名。”
潘切·比恩(


1

在我的WCF服务项目中,此问题是由于参考System.Web.Mvc.dll的不同版本引起的。因此可能是DLL不同版本的兼容性问题

当我使用

System.Web.Mvc.dll版本5.2.2.0->引发错误。响应消息的charset = utf-8

但是当我使用 System.Web.Mvc.dll版本4.0.0.0或更低版本->时,它工作正常

我不知道使用不同版本的DLL的原因,但是通过更改DLL的版本,它对我有用。

当您在WCF项目中添加其他项目的引用并且此引用项目具有不同版本的System.Web.Mvc DLL或可能是任何其他DLL时,甚至会生成此错误。


1

注意:如果您的目标服务器端点正在使用安全套接字层(SSL)证书

将您的.config设置从更改basicHttpBindingbasicHttpsBinding

我相信,它将解决您的问题。


0

X ++ binding = endPoint.get_Binding(); binding.set_UseDefaultWebProxy(false);


1
如果是的话,这是您的答案吗,请解释它是如何解决问题的。
拉希尔·瓦齐尔

有时由于某种未知原因,我们的程序无法找到代理服务器,因此请勿使用默认代理,并在代码中设置代理的IP地址。这样它将开始工作
丹麦,

0

我通过在web.config中设置UseCookies解决了这个问题。

  <system.web>
    <sessionState cookieless="UseCookies" />

并设置enableVersionHeader

  <system.web>
    <httpRuntime targetFramework="4.5.1" enableVersionHeader="false" executionTimeout="1200" shutdownTimeout="1200" maxRequestLength="103424" />

0

如果您同时使用wshttpbinding和https请求,那么我将通过以下配置更改来解决它。

 <security mode="TransportWithMessageCredential">
                    <transport clientCredentialType="None" />
                    <message clientCredentialType="Certificate" />
                </security>

0

对我来说,当我在Web.config中评论以下行时,此问题已解决

<httpErrors errorMode="Detailed" />

0

嗨,在我的情况下,出现此错误是因为Web服务的应用程序池具有错误的32/64位设置。因此,此错误需要以下修复:您转到IIS,选择Web服务的站点,转到“高级”设置并获取应用程序池。然后转到“应用程序池”,选择它,转到“高级设置...”,选择“启用32位应用程序”,然后根据您的Web服务的32/64位类型将其设为“启用”或“禁用”。如果设置为True,则意味着它仅允许32位应用程序,因此对于64位应用程序,必须将其设置为“禁用”(默认)。



-1

我的解决方案非常简单:从应用程序中备份所有内容,将其卸载,从其余文件夹(而不是文件夹)中删除所有内容,这样我就不必再次授予相同的权限了,然后从备份中复制回文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.