【问题标题】:Getting "end of file" when passing complex type to WCF service将复杂类型传递给 WCF 服务时获取“文件结尾”
【发布时间】:2015-01-25 13:45:12
【问题描述】:

我尝试使用带有以下数据的 jquery ajax POST 调用 WCF 服务:

数据 = "{\"StudentID\":\"18\",\"Message\":{\"Header\":{\"EMailID\":\"0\",\"From\":{\"AddressType \":\"0\",\"别名类型\":\"0\",\"名称\":\" Teacher\",\"StudentID\":\"18\",\"SymbolURL\":\"teacher.png\",\"Address\":\"18\"},\"To\":{ \"AddressType\":\"0\",\"AliasType\":\"0\",\"Name\":\"Ian \",\"StudentID\":\"346\",\"SymbolURL\":\"\",\"Address\":\"346\"},\"TimeRecieved\":\"/Date( 0)/\"},\"版本\":\"1\",\"MailMessageXML\":\"\",\"CompressedBody\":\"\"},\"ImageFileName\":\" \"}"

我收到一个错误(响应正文):

{"ExceptionDetail":{"HelpLink":null,"InnerException":{"HelpLink":null,"InnerException":{"HelpLink":null,"InnerException":null,"Message":"出乎意料 文件结束。","StackTrace":" at System.Xml.EncodingStreamWrapper.ReadBOMEncoding(布尔 notOutOfBand)\u000d\u000a 在 System.Xml.EncodingStreamWrapper..ctor(流流,编码 编码)\u000d\u000a

......

这是我的 WCF 函数:

    [DataContract]
    public class MailHeader
    {
        [DataMember] public Int64 EMailID;
        [DataMember] public MailAddress From;
        [DataMember] public MailAddress To;
        [DataMember] public DateTime TimeRecieved;
    }

    [DataContract]
    public class MailAddress
    {
        [DataMember] public Int64 AddressType;
        [DataMember] public Int64 AliasType;
        [DataMember] public string Name;
        [DataMember] public Int64 StudentID;
        [DataMember] public string SymbolURL;
        [DataMember] public string Address;
    }

    [DataContract]
    public class MailMessage
    {
        [DataMember] public MailHeader Header;
        [DataMember] public Int64 version;
        [DataMember] public XElement MailMessageXML;
        [DataMember] public byte[] CompressedBody;
    }

SendMessageStatusType SendMessage(Int64 StudentID, MailMessage Message,string ImageFileName);

This is my servicemodel from web.config:   
<system.serviceModel/>
    <behaviors>
      <endpointBehaviors>
        <behavior name="AjaxBehavior">
          <enableWebScript />
        </behavior>
      </endpointBehaviors>

      <serviceBehaviors>
        <behavior name="metadataGetBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" ></serviceDebug>
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <bindings>
      <customBinding>
        <binding name="binaryEncoding" >
          <httpTransport />
        </binding>
      </customBinding>
    </bindings>

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />


    <services>
      <service name="XXXX.Web.XXXXSVC" behaviorConfiguration="metadataGetBehavior">
        <endpoint address="ajax" behaviorConfiguration="AjaxBehavior"
            binding="webHttpBinding" contract="XXXX.Web.IXXXXSVC" />
        <endpoint address="binary"
          binding="customBinding" bindingConfiguration="binaryEncoding"
          contract="XXXX.Web.IXXXXSVC" />
      </service>
    </services>

  </system.serviceModel>

jquery 调用很简单,与其他对我有用的方法相同:

$.ajax({

    type: "POST", 
    url: Url, // Location of the service
    data: Data, //Data sent to server
    contentType: "application/json; charset=utf-8",
    processdata: false, //True or False
    success: function (msg) {

        //On Successfull service call

        successCallBackFunc(msg);

    },

    error: errorCallBackFunc  // When Service call fails

});

任何想法为什么它不起作用?

【问题讨论】:

  • 我从来没有对 WCF 做过任何事情,我也不知道它的 API,但你确定你期待的是 JSON 吗?在某个名为 System.Xml.EncodingStreamWrapper... 的类中抛出异常

标签: jquery ajax json wcf


【解决方案1】:

好的。我想通了:

当您发送类型为:XElement 的字段时,它不能是空字符串,并且必须是正确的 XML 格式。

同样适用于字节[]类型,它必须在列表:[0]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2014-01-06
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    相关资源
    最近更新 更多