92

我有一个 WCF 服务在我的本地机器上运行良好。我把它放在服务器上,我收到以下错误:

接收对http://xx.xx.x.xx:8200/Services/WCFClient.svc的 HTTP 响应时 出错。这可能是由于服务端点绑定未使用 HTTP 协议。这也可能是由于服务器中止了 HTTP 请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。]

我已经访问了 url 中的服务,它工作正常。我为该函数所做的只是将字符串返回到图像名称,因此传递的数据并不多。我跟踪了日志,它给了我相同的信息。这是我的客户端配置:

<binding name="basicHttpBinding_IWCFClient" closeTimeout="00:01:00"
         openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
         bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
         messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
         allowCookies="false">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
                  maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                  maxNameTableCharCount="2147483647" />
    <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
</binding>
<endpoint name="basicHttpBinding_IWCFClient" 
    address="http://localhost:4295/Services/WCFClient.svc"
    binding="basicHttpBinding" 
    bindingConfiguration="basicHttpBinding_IWCFClient" 
    behaviorConfiguration="WCFGraphicManagementTool.Services.ClientBehavior"
    contract="WCFClient.IWCFClient" />

这是我的服务器配置:

<service behaviorConfiguration="WCFGraphicManagementTool.Services.WCFClientBehavior"
    name="WCFGraphicManagementTool.Services.WCFClient">
   <endpoint name="basicHttpBinding_IWCFClient"
       address="" 
       binding="basicHttpBinding" 
       contract="WCFGraphicManagementTool.Contracts.IWCFClient" />
   <endpoint 
       address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" />
</service>
<behavior name="WCFGraphicManagementTool.Services.WCFClientBehavior">
   <dataContractSerializer maxItemsInObjectGraph="2147483647" />
   <serviceThrottling maxConcurrentCalls="120" maxConcurrentSessions="120"
                      maxConcurrentInstances="120" />
   <serviceMetadata httpGetEnabled="true" />
   <serviceDebug includeExceptionDetailInFaults="true" />
</behavior>

因为它在我的本地机器上工作,所以它会是服务器上的设置吗?

4

23 回答 23

108

我认为存在序列化问题,您只需在<configuration>部分的服务配置中添加以下代码即可找到确切的错误。

配置更新"App_tracelog.svclog"文件将创建后,您的服务所在的位置只需要打开.svclog文件并在左侧面板上找到红色线,这是错误的,并查看其描述以获取更多信息。

我希望这将有助于找到您的错误。

<configuration>
...
...

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.Runtime.Serialization" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="App_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp" />
    </sharedListeners>
  </system.diagnostics>

  </configuration>

更新: 如果您找不到更新的"App_tracelog.svclog"文件,请查找"<some GUID>App_tracelog.svclog"类似"a39e3026-5dd8-4d39-842a-04d486615eedApp_tracelog.svclog"

于 2013-01-23T14:10:59.430 回答
77

我遇到了这个问题“这可能是由于服务端点绑定不使用 HTTP 协议”并且 WCF 服务将关闭(在开发机器中)

我想通了:就我而言,问题是因为枚举,

我用这个解决了

    [DataContract]
    [Flags]
    public enum Fruits
    {
        [EnumMember]
        APPLE = 1,
        [EnumMember]
        BALL = 2,
        [EnumMember]
        ORANGE = 3 

    }

我必须用 DataContract、Flags 和所有具有 EnumMember 属性的枚举成员来装饰我的枚举。

在查看此msdn 参考后,我解决了这个问题:

于 2012-08-11T18:56:21.560 回答
17

我有同样的错误,问题是序列化。我设法使用服务跟踪查看器http://msdn.microsoft.com/en-us/library/ms732023.aspx找到了真正的问题并轻松解决。也许这会对某人有所帮助。

于 2012-01-26T08:06:51.617 回答
16

在我的实例中,生成错误是因为我的一种复杂类型的属性没有设置方法。

由于这个事实,序列化程序引发了异常。添加了内部设置方法,一切正常。

找出发生这种情况的最佳方法(在我看来)是启用跟踪日志记录。

我通过将以下部分添加到我的web.config

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
    <source propagateActivity="true" name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
  </sources>
  <trace autoflush="true" />
</system.diagnostics>

设置后,我运行我的客户端,出现异常并检查了“Traces.svclog”文件。从那里,我只需要找到异常。

于 2015-01-29T19:09:20.920 回答
9

使用 DataContract 的解决方案,枚举标志看起来有点难看。在我的情况下,通过在枚举中添加类似“NotSet = 0”的内容来解决问题:

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}
于 2013-02-25T06:45:51.720 回答
5

我遇到了同样的问题并用下面的代码解决了。(如果有任何 TLS 连接问题)

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

请在打开客户频道之前粘贴此行。

于 2018-10-17T23:58:50.470 回答
2

我已经看到这个错误是由对象图中的循环引用引起的。包含来自子对象的指向父对象的指针将导致序列化程序循环,并最终超过最大消息大小。

于 2013-03-12T16:47:20.133 回答
2

我为此苦苦挣扎了几天,并尝试了这篇文章和许多其他人的所有答案,并分享了我的解决方案,因为症状相同但问题不同。

问题是应用程序池配置了内存限制,并且在可变时间段后才被回收。

希望这对其他人有帮助!
问候,

于 2015-09-10T14:30:57.267 回答
1

我解决了这个问题。它最终成为我的配置文件的路径是错误的。WCF 的错误有时很有帮助。

于 2011-05-16T13:42:22.630 回答
1

为了解决这个问题,我们必须将 AppPool Identity 更改为管理员帐户

于 2013-01-17T01:42:42.100 回答
1

我的问题是,我的服务的返回类型是字符串。但我返回了 xml 类型的字符串:

<reponse><state>1</state><message>Operation was successfull</message</response>

所以抛出了错误。

于 2013-04-19T09:33:51.113 回答
1

此错误可能是由于合同不匹配造成的。考虑下面的三层应用程序......

UI 层
|
工艺层
|
数据访问层
-> 进程和 UI 层之间的合同具有相同的枚举,但缺少 (Onhold = 3)。枚举:开始 = 1,停止 = 2。-> 数据访问和进程层之间的合同具有枚举枚举:开始 = 1,停止 = 2,保持 = 3。

在这种情况下,我们将在流程层响应中得到相同的错误。

多层应用程序中的其他合约不匹配也会出现同样的错误。

于 2013-05-09T04:25:46.363 回答
1

我遇到了这个问题,因为我将 WCF 服务配置为返回 System.Data.DataTable。

它在我的测试 HTML 页面中运行良好,但是当我将它放入我的 Windows 窗体应用程序时就崩溃了。

我必须进去将服务的操作合同签名从 DataTable 更改为 DataSet 并相应地返回数据。

如果您遇到此问题,您可能需要向您的服务添加额外的操作合同,这样您就不必担心破坏依赖现有服务的代码。

于 2013-09-30T21:45:24.350 回答
1

这可能是由于许多原因;以下是其中的几个:

  1. 如果您正在使用复杂的数据协定对象(这意味着具有更多子自定义对象的自定义对象),请确保您拥有使用 DataContract 和 DataMember 属性修饰的所有自定义对象
  2. 如果您的数据协定对象使用继承,请确保所有基类都具有 DataContract 和 DataMember 属性。此外,您需要让基类使用 [KnownType(typeof(BaseClassType))] 属性指定派生类(在此处查看更多信息)。

  3. 确保所有数据协定对象属性都具有 get 和 set 属性。

于 2013-10-02T18:18:55.870 回答
1

我的问题是客户端和服务器之间传递的项目太多。我不得不在双方的行为中更改此设置。

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
于 2014-12-09T17:38:47.350 回答
1

这可能与您的特定问题无关,但您提到的错误消息有很多原因,其中之一是使用了 [OperationContract] 的返回类型,该类型是抽象的、接口的或 WCF 客户端代码不知道的。

检查下面的帖子(和解决方案)

https://stackoverflow.com/a/5310951/74138

于 2015-03-08T08:40:19.280 回答
1

我认为解决此问题的最佳方法是遵循错误建议,从而查找服务器日志。要启用我添加的日志

 <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\logs\TracesServ_ce.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

然后你去 c:\logs\TracesServ_ce.svclog 用微软服务跟踪查看器打开它。看看问题到底是什么。

于 2015-07-06T08:34:23.717 回答
1

有关此问题的更多信息,另请参阅: 远程主机强制关闭现有连接 - WCF

我的问题最终是我的数据传输对象太复杂了。从简单的属性开始public long Id { get; set; },一旦你开始工作,然后根据需要开始添加额外的东西。

于 2015-09-10T02:55:30.630 回答
1

就我而言

我的服务具有以下功能download Files

并且此错误仅在尝试下载时出现Big Files

所以我找到了增加所需价值的答案maxRequestLengthweb.config

我知道这很奇怪,但问题解决了

如果您不进行任何上传或下载操作,则此答案可能对您无济于事

于 2016-06-23T08:02:46.207 回答
1

对我来说,这个错误的解决方案很奇怪。这是EndpointAddress的端口地址问题。在 Visual Studio 中,文件的端口地址(例如 Service1.svc)和 wcf 项目的端口地址必须与您提供给EndpointAddress的端口地址相同。让我详细描述一下这个解决方案。

检查端口地址有两个步骤。

  1. 在您的 WCF 项目中,右键单击您的服务文件(例如 Service1.svc)-> 现在在浏览器中选择在浏览器中查看,您的 URL 类似于http://localhost:61122/Service1.svc 所以现在记下您的端口地址为61122

  2. 右键单击您的 wcf 项目 -> 选择属性-> 转到Web 选项卡-> 现在在服务器部分-> 选择使用 Visual Studio 开发服务器-> 选择特定端口并提供我们之前从 Service1 中找到的端口地址。 svc 服务。即(61122)

早些时候我有不同的端口地址。在正确指定我已提供给EndpointAddress的端口地址后,我的问题就解决了。

我希望这可以解决您的问题。

于 2016-10-10T12:13:10.310 回答
0

也有这个问题,这是由于忘记用 DataContract 和 DataMember 属性装饰我的模型

于 2016-09-14T11:33:27.203 回答
0

如果你有一个数据库(在 Visual Studio 中工作),请确保表中没有外键,我有外键,它给了我这个错误,当我删除它们时它运行顺利

于 2020-09-22T13:17:26.107 回答
0

我意识到这个问题似乎有很多“解决方案”。我在调用 wsdl 的 VB.NET 应用程序中遇到了同样的错误消息。我发布应用程序的框架是 3.5,IT 最近在我的应用程序服务器上禁用了 TLS 1.0 和 1.1,该应用程序将应用程序作为计划任务运行。

将应用程序框架定位到 4.5.2 为我解决了这个问题。

于 2022-01-14T20:26:19.493 回答