我正在调用一个现在在IIS中工作的ASP.NET站点中托管的服务。我的测试应用程序让我创建服务引用并让我智能感知输入所有参数。调用该服务时,我收到以下错误:
内容类型text / html; charset =响应消息的UTF-8与绑定的内容类型不匹配(text / xml; charset = utf-8)。
我使用fiddler(根据本网站上其他问题的信息)查看返回的html,我看到正在返回标准服务网页。以下是一些文字:
要测试此服务,您需要创建一个客户端并使用它来调用该服务。您可以使用命令行中的svcutil.exe工具使用以下语法执行此操作...
为什么我没有收到真正的服务回复?
这是web.config的那部分: 顺便说一句,我的网站是https。
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://www.ed.net/Service.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService"
contract="EdQuotingService.IService" name="BasicHttpBinding_IService" />
</client>
</system.serviceModel>
编辑:我们最终支付了微软支持请求以解决问题。他们是这样做的:
我们请求了Global.asax文件,我们发现其中存在重定向代码,如下所示:
Protected Sub Application_BeginRequest(sender As Object, e As System.EventArgs)
If HttpContext.Current.Request.IsSecureConnection.Equals(False) And mid(Request.ServerVariables("HTTP_HOST"), 1, 9) <> "localhost" Then
Response.Redirect("https://" & Request.ServerVariables("HTTP_HOST") & HttpContext.Current.Request.RawUrl)
End If
我们再次分析了所有数据,我们发现当我们尝试读取服务配置时,它无法读取配置文件,因此它使用了所有默认配置。在迹象中可以清楚地看到这一点。这是因为它无法找到服务标签,因此它使用了所有默认设置。我们还发现您的服务侦听2个端点 - http和https。因此,当我们浏览wsdl文件时,我们发现您的服务基本上配置为侦听http而不是https。因此,我们发现您的方法StartQuote配置为侦听http。因此,客户端在http上为此接口进行调用,并且您的global.asax文件捕获此信息并重定向到https。
从我们收集到的WCF跟踪中,我们发现未找到配置评估上下文的错误,然后找不到匹配的标记,如下所示:
未找到错误配置评估上下文意味着我们无法从配置文件中读取正确的配置。此外,由于System.ServiceModel标签下没有定义服务标签,因此它接收了默认配置,即没有SSL的basichttpbinding。因此,当客户端尝试进行方法调用时,它将在http而不是https上进行调用,这会被global.asax文件拾取并将其重定向到https。
我们继续在System.ServiceModel标记下添加了Service标记,如下所示:
<services>
<service name="EdisonQuotingService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="(binding name specified by you)_Transport"
contract="IService" />
</service>
</services>
<basicHttpBinding>
<binding name="(binding name specified by you)">
<security mode="Transport" />
</binding>
</basicHttpBinding>
我们进行了上述更改,之后当我们尝试从WCF服务调用方法StartQuote时,它没有问题,并且您能够获得必要的数据。