【问题标题】:WCF service and client returning invalid response typeWCF 服务和客户端返回无效的响应类型
【发布时间】:2015-01-31 11:47:51
【问题描述】:

我已经阅读了网络上关于这个确切错误的所有相关问题:

内容类型text/html;响应消息的charset=UTF-8 与绑定的内容类型不匹配(text/xml; charset=utf-8)

但是,我仍然无法确定错误的实际原因是什么。它在负载均衡器后面的 4 个 Web 服务器随机发生。发生错误时,我在负载均衡器名称所在的地址栏中手动输入其中一个 Web 服务器名称。不会从该特定实例的其中一个 Web 服务器检索数据,但如果我尝试其他服务器,我会取回数据。

我们不能指望我们的用户手动将负载平衡器的 url 更改为 4 个服务器名称之一来尝试获得成功。

根据我的阅读,客户端和服务器之间似乎存在配置错误。如果是这样,那不是一直都在发生吗?从我的日志消息来看,错误显然发生在 MVC 控制器方法内的客户端。

我在下面发布我的代码,希望有人能回答这个问题。我真的很感激。

服务器配置

<system.serviceModel>
    <services>
      <service name="FuelTktImgRetrievalSvc.FuelTktImgRetrieval" behaviorConfiguration="ServiceBehavior">
        <endpoint address="" binding="basicHttpBinding" contract="FuelTktImgRetrievalSvc.IFuelTktImgRetrieval" bindingConfiguration="BasicHttpBinding_IFuelTktImgRetrieval">
          <identity>
            <dns value="localhost" />
          </identity>
      </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <!--<add baseAddress="\\miavdeteoabweb\applications\FuelTktImgRetrievalSvc" />-->
          </baseAddresses>
        </host>
      </service>
    </services>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IFuelTktImgRetrieval" closeTimeout="00:10:00"
      openTimeout="00:10:00" receiveTimeout="04:00:00"
      sendTimeout="04:00:00" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" />
      </basicHttpBinding>
    </bindings>
    <diagnostics wmiProviderEnabled="false" performanceCounters="All">
      <messageLogging logMessagesAtTransportLevel="true" logMessagesAtServiceLevel="true" logMalformedMessages="true" logEntireMessage="true" maxSizeOfMessageToLog="2147483647" maxMessagesToLog="500" />
    </diagnostics>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="http" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

客户端配置

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IFuelTktImgRetrieval" />
      </basicHttpBinding>
    </bindings>
    <diagnostics wmiProviderEnabled="true">
      <messageLogging logMessagesAtTransportLevel="true" logMessagesAtServiceLevel="true" logMalformedMessages="true" logEntireMessage="true" maxSizeOfMessageToLog="2147483647" maxMessagesToLog="500" />
    </diagnostics>
    <client>
      <endpoint address="http://ride/FuelTktImgRetrievalSvc/FuelTktImgRetrieval.svc"
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IFuelTktImgRetrieval"
        contract="FuelTktImgRetrievalSvc.IFuelTktImgRetrieval" name="BasicHttpBinding_IFuelTktImgRetrieval" />
    </client>
    <behaviors>
      <endpointBehaviors>
        <behavior name="webhttp">
          <webHttp />
        </behavior>
        <behavior name="BasicHttpBinding_IFuelTktImgRetrieval">
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>

被调用的服务器方法

public async Task<List<HH_FuelTkt_Output>> GetFilteredFuelTicketsAsync(HH_FuelTkt_Input value)
        {

            using (HandheldEntities DbContext = new HandheldEntities())
            {
                using (var dbcxtTrans = DbContext.Database.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted))
                {
                    try
                    {
                        // code left out for brevity
                        List<HH_FuelTkt_Output> tkts_Combined = await tkts.ToListAsync();

                        dbcxtTrans.Commit();

                        return tkts_Combined;
                    }

MVC 控制器代码

[HttpPost]
public async Task<JsonResult> GetFilteredFuelTicketsAsync(HH_FuelTkt_Input id)
{
    try
    {
        IEnumerable<HH_FuelTkt_Output> fto = await db.GetFilteredFuelTicketsAsync(id);

        return Json(fto, JsonRequestBehavior.AllowGet);
    }

从客户端到服务的 AJAX 调用。

$.ajax({
                    url: '@Url.Action("GetFilteredFuelTicketsAsync", "Home")',
                    data: JSON.stringify(HH_FuelTkt_Input),
                    dataType: 'json',
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    success: function (data) {

【问题讨论】:

    标签: c# asp.net-mvc json wcf wcf-binding


    【解决方案1】:

    这可能是您在客户端而不是服务器上看到的错误。错误消息指出它收到了text/html,而它在期待text/xml。当服务托管在 IIS 中并且服务器的某些问题导致它以 ASP.NET 错误页面(将是 HTML)而不是 SOAP 响应(将是 XML)进行响应时,通常会出现这种情况。错误的间歇性以及您使用负载平衡器的事实向我表明,负载平衡器后面的其中一台服务器有问题。

    您可以单独访问服务器吗?尝试浏览到每个服务器的 .svc 页面和/或在诸如 soapui 之类的工具中调用 Web 服务,您应该会看到 HTML 错误页面。或者尝试在每台服务器上搜索 ASP.NET 错误的 Windows 事件日志,您可能会发现记录的旧错误之一。

    【讨论】:

    • 我可以单独访问服务器。我能够浏览到每个服务器的 svc 页面。它间歇性地发生,我无法让它出错。感谢您的输入。我会联系我们的管理员并提出您的建议...
    猜你喜欢
    • 1970-01-01
    • 2011-03-13
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多