54

尝试将 WCF 服务添加到 WCFTestClient 时出现以下错误。我在网上浏览了许多解决方案,但我无法让它工作。

有人可以帮我解决这些问题吗?我还提供我的服务配置文件:

内容类型应用程序/soap+xml;charset=utf-8 was not supported by service 客户端和服务绑定可能不匹配。远程服务器返回错误:(415)无法处理消息,因为内容类型'application/soap+xml; charset=utf-8' 不是预期的类型 'text/xml; 字符集=utf-8

代码:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file 
  must be added to the host's app.config file. System.Configuration does not 
  support config files for libraries. -->
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="basicHttp" allowCookies="true"
                 maxReceivedMessageSize="20000000"
                 maxBufferSize="20000000"
                 maxBufferPoolSize="20000000">
          <readerQuotas maxDepth="32"
               maxArrayLength="200000000"
               maxStringContentLength="200000000"/>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
     <service name="WCFTradeLibrary.TradeService">
        <endpoint address="" binding="basicHttpBinding"
            bindingConfiguration="basicHttp"
            contract="WCFTradeLibrary.ITradeService">          
         </endpoint>
     </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint 
          above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faul`enter code here`ts for 
          debugging purposes,  
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception info`enter code here`rmation -->
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>
4

17 回答 17

15

我遇到命名问题。服务名称必须与您的实现完全一致。如果不匹配,则默认使用basicHttpBinding导致text/xml内容类型。

您的班级名称在两个地方 - SVC 标记和 CS 文件。

检查端点合同 - 再次准确的接口名称,仅此而已。我已经添加了无法存在的程序集名称。

<service name="MyNamespace.MyService">
    <endpoint address="" binding="wsHttpBinding" contract="MyNamespace.IMyService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  </service>
于 2014-08-14T07:58:18.323 回答
8

这是为我解决问题的 web.config 示例。注意< binding name="TransportSecurity" messageEncoding="Text" textEncoding="utf-8">

于 2013-12-28T15:03:23.423 回答
6

在我的情况下,其中一个类没有默认构造函数 - 没有默认构造函数的类无法序列化。

于 2014-02-06T06:45:43.457 回答
5

我遇到了同样的问题,通过执行以下操作将服务与服务行为“绑定”来使其工作:

为行为命名

<serviceBehaviors>
        <behavior name="YourBehaviourNameHere">

并参考您在服务中的行为

<services>
  <service name="WCFTradeLibrary.TradeService" behaviorConfiguration="YourBehaviourNameHere">

整个事情是:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="basicHttp" allowCookies="true"
                 maxReceivedMessageSize="20000000"
                 maxBufferSize="20000000"
                 maxBufferPoolSize="20000000">
          <readerQuotas maxDepth="32"
               maxArrayLength="200000000"
               maxStringContentLength="200000000"/>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
     <service name="WCFTradeLibrary.TradeService" behaviourConfiguration="YourBehaviourNameHere">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttp" contract="WCFTradeLibrary.ITradeService">          
         </endpoint>
     </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="YourBehaviourNameHere">
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faul`enter code here`ts for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception info`enter code here`rmation -->
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>
于 2013-03-22T14:55:59.137 回答
3

正如其他人所建议的那样,这是由于服务客户端不匹配而发生的。

我遇到了同样的问题,调试什么时候知道绑定不匹配。我指的是BasicHttpBinding而不是WSHTTPBinding。就我而言,我指的是BasicHttpWsHttp。我根据引用动态分配绑定。所以检查你的服务构造函数,如下所示

参考这张图片

于 2018-07-24T10:29:37.707 回答
1

我的情况有不同的解决方案。客户端使用的是basichttpsbinding [1],而服务使用的是 wshttpbinding。

我通过将服务器绑定更改为 basichttpsbinding 解决了这个问题。另外,我必须通过添加将目标框架设置为 4.5:

  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>

[1] 通信通过 https。

于 2014-09-15T17:12:42.383 回答
1

WCF当客户端尝试使用MTOM extension (MIME type application/soap+xml用于传输来发送其消息时可能会出现此错误SOAP XML in MTOM),但服务只能理解普通的 SOAP 消息(它不包含 MIME 部分,HTTP 请求中只有 text/xml 类型)。

确保您根据正确的WSDL.

为了在服务器端使用 MTOM,更改配置文件添加messageEncoding属性:

<binding name="basicHttp" allowCookies="true"
             maxReceivedMessageSize="20000000"
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000"
             messageEncoding="Mtom" >
于 2014-04-23T10:21:00.040 回答
1

对我来说,由于涉及到大量的方法和类,因此很难识别问题。

我所做的是从 WebService 接口中注释(删除)一些方法并尝试,然后注释另一组方法并尝试,我一直这样做,直到找到导致问题的方法。

就我而言,它使用了一个无法序列化的复杂对象。

祝你好运!

于 2017-05-08T09:01:30.487 回答
0

在我的情况下,同样的错误是由于缺少

[DataContract]
...
[DataMember] 

返回数据类型中的属性。

检查并尝试添加它们,看看是否有帮助。

于 2013-07-24T14:09:38.200 回答
0

我遇到了同样的错误信息。我设法修复它:

就我而言,错误是我错过了返回类的父类中的 [datacontract] 和 [datamember] 属性。错误消息具有误导性。

[OperationContract]
List<MyClass> GetData();

[DataContract]
public class MyClass : MyParentClass
{       
    [DataMember]
    public string SomeString { get; set; }      
}

// Missing DataContract
public class MyParentClass
{
    // Missing DataMember
    public int SomeNumber { get; set; }

}
于 2015-06-01T09:44:44.990 回答
0

我遇到了同样的问题,并通过将EnumMemberAttribute用于枚举成员的属性来解决它。如果您使用枚举类型作为数据协定,并且其成员使用DataMemberAttribute属性,则会发生相同的错误。您必须对枚举成员使用EnumMemberAttribute

于 2020-01-08T12:03:01.563 回答
0

我的问题是我们自己的集合类,它被标记为 [DataContract]。从我的角度来看,这是一种干净的方法,它与 XmlSerializer 一起工作得很好,但对于 WCF 端点它正在破坏,我们不得不将其删除。没有 XmlSerializer 仍然可以工作。

不工作

[DataContract]
public class AttributeCollection : List<KeyValuePairSerializable<string, string>>

在职的

public class AttributeCollection : List<KeyValuePairSerializable<string, string>>
于 2019-02-23T11:03:18.750 回答
0

我在跟踪日志中也有同样的错误。我在 API 中新创建的函数抛出了同样的错误,但令我惊讶的是,旧函数表现良好。问题是 - 我的合同数据成员几乎没有对象类型的变量。soap-xml 无法很好地处理它,但是,我可以看到对象类型数组 (object[]) 正在顺利通过。只有一个简单的对象类型没有被soap解析。这可能是服务引发上述错误的另一个原因。

于 2018-03-01T21:03:29.427 回答
0

我在使用 WebServiceTemplate spring ws [err] org.springframework.ws.client.WebServiceTransportException 时遇到同样的错误:无法处理消息,因为内容类型为 'text/xml; charset=utf-8' 不是预期的类型 'application/soap+xml; 字符集=utf-8'。[415] [错误] 在 org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:665)。我使用的 WSDL 具有 soap1.2 协议,默认情况下该协议是 soap1.1 。当我使用下面的代码更改协议时,它正在工作

 MessageFactory msgFactory = MessageFactory.newInstance(javax.xml.soap.SOAPConstants.SOAP_1_2_PROTOCOL);
     SaajSoapMessageFactory saajSoapMessageFactory = new SaajSoapMessageFactory(msgFactory);
     saajSoapMessageFactory.setSoapVersion(SoapVersion.SOAP_12);
     getWebServiceTemplate().setMessageFactory(saajSoapMessageFactory);
于 2019-06-28T20:48:50.273 回答
0

我也遇到了同样的问题。就我而言,我使用的是 transfermode = streaming 和 Mtom。事实证明,我已经将我的一个变量(用于结构)命名为“HEADER”。这与作为 http 服务下载的一部分的消息元素 [ http://tempuri.org/:HEADER]冲突。显然,必须避免使用“保留”字样作为参数名称。

于 2020-02-03T23:42:33.197 回答
-3

我必须将 ?wsdl 参数添加到 url 的末尾。例如:http://localhost:8745/YourServiceName/?wsdl

于 2016-01-28T11:18:41.157 回答
-4

检查绑定部分上标识到 web.config 的客户端配置文件

于 2013-12-12T12:45:19.587 回答