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


87

我的WCF服务在本地计算机上运行良好。我将其放在服务器上,并且收到以下错误:

收到对http://xx.xx.x.xx:8200 / Services / WCFClient.svc的HTTP响应时发生错误 。这可能是由于服务端点绑定未使用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>

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


我在这里解释了我的问题:stackoverflow.com/questions/5537794/…–
Adi

好像你比我更远。也许您可以给我一个下一步的建议。stackoverflow.com/questions/16628382/...
尼尔斯BRINCH

您是否有机会接受任何答案,因为我怀疑您仍在等待得到答案?:)
Noctis

Answers:


100

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

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

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

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

4
这实际上节省了我的时间。确实,这是一个序列化问题,我System.Runtime.Serialization在跟踪中丢失了源。
julealgon13年

尼斯...没有意识到这一点:)
Noctis

史诗!写入错误,它没有任何异常已面市,到App_tracelog.svclog文件
伏波

辉煌!谢谢
SyntaxError

1
请确保将该<system.diagnostics>部分粘贴到文件末尾的正上方</configuration>。如果将其粘贴在顶部,则在运行应用程序时可能会出现内容类型错误。
塔瓦卜·瓦基尔19'May

75

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

我发现:就我而言,问题出在Enums,

我解决了使用这个

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

    }

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

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


1
谢谢。这正是我必须要做的。
马修·科尔

1
谢谢,您刚刚为我节省了很多时间
nixon 2012年

4
非常感谢..节省了我很多时间
amesh 2013年

与此相关的是-如果合同上的枚举类型不是DataMember的类型,则将收到此错误。我只是简单地添加了一个属性,该属性是一个DataMember,并为其提供了非DataContract枚举类型。
2013年

枚举还需要从索引0开始的情况吗?对我来说,这当然是一个过去的问题。因此,在上面的例子中APPLE = 0而不是1
参议员


14

在我的实例中,由于我的一种复杂类型具有不带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”文件。从那里,我只需要找到例外。


autoflush = true是关键
杰里米·史密斯

9

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

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

是的,很抱歉,只是对进一步的回答发表了评论。我也看到过这种行为。
参议员

说明:我有同样的问题。@Rikin的答案将我引到:“来自[ social.msdn.microsoft.com/Forums/vstudio/en-US/…的InnerException消息是'Enum value'0 '对于类型无效...”,我得到了jem: “这里的问题是您没有初始化..Response,并且它采用默认(且无效)值'0'...,因此无法序列化”。
AJ AJ

3

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

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

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


1

我解决了这个问题。它最终是我的配置文件的路径错误。WCF的错误有时非常有用。



1

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


1

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

UI层
|
流程层
|
资料存取层
->流程和UI层之间的协定缺少相同的枚举(保留= 3)。枚举:开始= 1,停止=2。->数据访问和流程层之间的协定具有枚举枚举:开始= 1,停止= 2,保留= 3。

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

同样的错误来自多层应用程序中的其他合同不匹配。


您的答案似乎与问题无关。另请注意,OP已经解决了他的问题-到配置文件的路径错误
西蒙MᶜKenzie'13年

1

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

在我的测试HTML页面中,它工作正常,但是当我将其放入Windows Form应用程序中时,它就爆炸了。

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

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


1

原因可能有很多。以下是其中一些:

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

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


1

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

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

我使用了相同的解决方案。但是我必须按照@ 100r的建议使用Service Trace Viewer,以查看这是错误。
比约恩

1

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

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

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


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,并使用Microsoft服务跟踪查看器将其打开。看看问题出在哪里。



1

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

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

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


1

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

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

所以抛出了错误。


1

就我而言

我的服务具有 download Files

而且此错误仅在尝试下载时显示 Big Files

所以我觉得这个答案要增加maxRequestLength所需值web.config

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

如果您不进行任何上传或下载操作,则此答案可能对您没有帮助


1

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

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

  1. 在WCF项目中,右键单击服务文件(例如Service1.svc),然后选择“在浏览器查看”,然后在浏览器中输入像http:// localhost:61122 / Service1.svc 这样的URL,因此现在记下您的端口地址为一61122

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

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

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



0

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

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.