这可能是由于服务端点绑定不使用HTTP协议

时间:2011-05-03 14:24:46

标签: wcf exception-handling wcf-binding net.tcp wcf-endpoint

我的本​​地计算机上运行的WCF服务正常运行。我把它放在服务器上,我收到以下错误:

  

接收时发生错误   HTTP响应   http://xx.xx.x.xx:8200/Services/WCFClient.svc。   这可能是由于服务   端点绑定不使用HTTP   协议。这也可能是由于   HTTP请求上下文被中止   服务器(可能是由于   服务关闭)。见服务器   日志了解更多详情。]

我已经使用了网址中的服务,但它运行正常。我正在为函数做的就是将一个字符串返回到一个图像名称,因此传递的数据不是很多。我已经跟踪了日志,它给了我相同的信息。这是我的客户端配置:

<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>

它是否是服务器上的设置,因为它可以在我的本地计算机上运行?

21 个答案:

答案 0 :(得分:86)

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

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

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

<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>

答案 1 :(得分:72)

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

我想通了:在我的情况下,问题是因为Enums,

我用这个

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

    }

我不得不使用DataContract,Flags和EnumMember属性的每个枚举成员来装饰我的Enums。

我在看了msdn Reference之后解决了这个问题:

答案 2 :(得分:17)

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

答案 3 :(得分:13)

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

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

找出原因(我认为)的最佳方法是启用跟踪日志记录。

我通过在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”文件。从那里,我只需要找到例外。

答案 4 :(得分:8)

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

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}

答案 5 :(得分:2)

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

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

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

答案 6 :(得分:1)

这可能是由于许多原因造成的;以下几点是:

  1. 如果您正在使用复杂的数据合同对象(这意味着具有更多子自定义对象的自定义对象),请确保您使用DataContract和DataMember属性修饰了所有自定义对象
  2. 如果数据协定对象使用继承,请确保所有基类都具有DataContract和DataMember属性。此外,您需要让基类使用指定派生类 [KnownType(typeof(BaseClassType))]属性(check out more info here on this)。

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

答案 7 :(得分:1)

有关此问题的更多信息,请参阅: An existing connection was forcibly closed by the remote host - WCF

我的问题最终导致我的数据传输对象过于复杂。从像public long Id { get; set; }这样的简单属性开始,一旦你开始工作,就开始根据需要添加其他东西。

答案 8 :(得分:1)

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

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

答案 9 :(得分:1)

我弄明白了这个问题。它最终成为我的配置文件的路径是错误的。 WCF的错误有时是非常有用的。

答案 10 :(得分:1)

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

它在我的测试HTML页面中运行良好,但是当我把它放在我的Windows窗体应用程序中时爆炸了。

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

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

答案 11 :(得分:1)

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

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

因此引发了错误。

答案 12 :(得分:1)

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

答案 13 :(得分:0)

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

UI图层   |
处理层
  |
数据访问层
- &GT; Process和UI层之间的契约具有相同的enum with missing(Onhold = 3)。枚举:开始= 1,停止= 2。 - &GT;数据访问和进程层之间的契约具有枚举Enum:Start = 1,Stop = 2,Onhold = 3.

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

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

答案 14 :(得分:0)

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

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

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

答案 15 :(得分:0)

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

using namespace std;
class MyClass
{
    public:
        MyClass() {}
        void foo() {}
    ....
};
vector<shared_ptr<MyClass>> V;
V.push_back(make_shared<MyClass>());
V[0]->foo();

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

答案 16 :(得分:0)

在我的情况下

我的服务具有download Files

的功能

此错误仅在尝试下载Big Files

时显示

所以我发现this answermaxRequestLength

web.config增加到所需的值

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

如果您不进行任何上传或下载操作,这个答案可能无法帮助您

答案 17 :(得分:0)

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

答案 18 :(得分:0)

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

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

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

  2. 右击你的wcf项目 - &gt;而不是选择属性 - &gt;转到网络标签 - &gt;现在位于服务器部分 - &gt;选择使用Visual Studio开发服务器 - &gt;选择特定端口并提供我们之前从Service1.svc服务中找到的端口地址。那是(61122)

  3. 之前我有不同的端口地址。正确指定端口地址后我已经在 EndpointAddress 中,我的问题解决了。

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

答案 19 :(得分:0)

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

答案 20 :(得分:-1)

要解决此问题,我们必须changed the AppPool Identity to an administrator account