C# WCF SOAP服务无法处理该消息,因为它发送多部分消息,并且需要“text/xml”;字符集=utf-8'

C# WCF SOAP服务无法处理该消息,因为它发送多部分消息,并且需要“text/xml”;字符集=utf-8',c#,wcf,soap,utf-8,multipart,C#,Wcf,Soap,Utf 8,Multipart,我对WCFSOAP1.1配置有问题。我已经用basicHttpBinding创建了一个WCF服务。下面是配置。该服务是WCF_SOAP_REST_service.BiasImpl: <system.serviceModel> <services> <service behaviorConfiguration="ServBehave" name="WCF_SOAP_REST_SERVICE.Service"> <en

我对WCFSOAP1.1配置有问题。我已经用basicHttpBinding创建了一个WCF服务。下面是配置。该服务是WCF_SOAP_REST_service.BiasImpl:

  <system.serviceModel>
    <services>
      <service behaviorConfiguration="ServBehave" name="WCF_SOAP_REST_SERVICE.Service">
        <endpoint address="soapService" binding="basicHttpBinding" contract="WCF_SOAP_REST_SERVICE.Service" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
      <service behaviorConfiguration="ServBehave" name="WCF_SOAP_REST_SERVICE.BiasImpl">
        <endpoint address="soapService" binding="basicHttpBinding" bindingConfiguration="basicHttp"
          contract="WCF_SOAP_REST_SERVICE.BiasImpl" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
     <bindings>
        <basicHttpBinding>
          <binding name="basicHttp" bypassProxyOnLocal="true" maxBufferSize="2147483647"
    maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
             useDefaultWebProxy="false" messageEncoding="Mtom" >
            <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
      maxArrayLength="2147483647" maxBytesPerRead="2147483647"
      maxNameTableCharCount="2147483647" />
          </binding>
        </basicHttpBinding>
     </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServBehave">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false before deployment -->
          <serviceMetadata httpGetEnabled="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="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
这就是实现:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CodificationImpl : Codification
{
    .
    .
    .

    public CheckQualityResponse CheckQuality(CheckQuality request)
    {
        //implementation goes here
    }

    .
    .
    .
}
检查质量等级:

[System.Diagnostics.DebuggerStepThrough()]
[System.CodeDom.Compiler.GeneratedCode("System.ServiceModel", "4.0.0.0")]
[MessageContract(WrapperName="CheckQuality", WrapperNamespace="http://my.custom.url/codification/", IsWrapped=true)]
public partial class CheckQuality
{

    [MessageBodyMember(Namespace="http://my.custom.url/codification/", Order=0)]
    [System.Xml.Serialization.XmlElement(IsNullable=true)]
    public CheckQualityCheckQualityRequest CheckQualityRequest;

    public CheckQuality()
    {
    }

    public CheckQuality(CheckQualityCheckQualityRequest CheckQualityRequest)
    {
        this.CheckQualityRequest = CheckQualityRequest;
    }
}

要接受多部分消息,我必须在WCF服务绑定中配置什么?

请查找以下可从SOAPUI工作的WCF服务

服务

[ServiceContract]
    public interface IImageService
    {
        [OperationContract]
        bool CheckQualityOfImage(CheckQuality objCheckQuality);
    }


    [DataContract]
    public class CheckQuality
    {
        [DataMember]
        public MemoryStream ImageData { get; set; }
        [DataMember]
        public string ImageFileName{ get; set; }
    }
以下接口的实现:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class ImageService : IImageService
    {
        public bool CheckQualityOfImage(CheckQuality objCheckQuality)
        {
            if (objCheckQuality != null)
            {
                if (objCheckQuality.ImageData.Length > 0 && ! String.IsNullOrEmpty(objCheckQuality.ImageFileName))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            return false;
        }
    }
服务器上的Web.config

<system.serviceModel>
    <bindings>
    <basicHttpBinding>
        <binding name="noSecurity" maxReceivedMessageSize="2147483647">
              <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647"
                            maxDepth="64" maxNameTableCharCount="2147483647" />
              <security mode="None"></security>
            </binding>
    </basicHttpBinding>
    </bindings>
    <services>
          <service name="XMLService.ImageService" behaviorConfiguration="default">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="noSecurity" contract="XMLService.IImageService" />
          </service>
    </services>
    <behaviors>
        <behavior name="default">
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />      
        </behavior>
    </behaviors>
</system.serviceModel>
现在,我从SOAPUI的请求如所附的屏幕截图所示

确保与SOAPUI中的请求属性匹配。可以找到有关使用带附件的SOAPUI的更多信息


注意:我对CheckQuality类中的属性做了一些假设,并且我使用了6MB的文件进行上传

您能介绍一下您的WCF方法吗?另外,请尝试将readerQuota值设置为大于预期请求大小的值。我更新了我的帖子,以包含服务接口和实现。另外,包括readerQuotas,同样的错误。关于为什么在OperationContract中包含XmlSerializationFormat,有什么具体原因吗??您还可以提供CheckQuality类属性它是使用svcutil自动生成的。但是,如果我删除它,它仍然有相同的错误。如果我错了,请更正我。您托管了一个具有CheckQuality方法的WCF服务。从客户端应用程序.NET应用程序或SOAP UI,您尝试将图像上载到此大小为500KB的服务,但出现异常。我看到您将图像作为附件发送。这不是我的选择。当从SOAPUII发送请求时,附件将转换为流。我使用groovy脚本从文件加载数据。
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class ImageService : IImageService
    {
        public bool CheckQualityOfImage(CheckQuality objCheckQuality)
        {
            if (objCheckQuality != null)
            {
                if (objCheckQuality.ImageData.Length > 0 && ! String.IsNullOrEmpty(objCheckQuality.ImageFileName))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            return false;
        }
    }
<system.serviceModel>
    <bindings>
    <basicHttpBinding>
        <binding name="noSecurity" maxReceivedMessageSize="2147483647">
              <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647"
                            maxDepth="64" maxNameTableCharCount="2147483647" />
              <security mode="None"></security>
            </binding>
    </basicHttpBinding>
    </bindings>
    <services>
          <service name="XMLService.ImageService" behaviorConfiguration="default">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="noSecurity" contract="XMLService.IImageService" />
          </service>
    </services>
    <behaviors>
        <behavior name="default">
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />      
        </behavior>
    </behaviors>
</system.serviceModel>