【问题标题】:WCF jquery parsererror unterminated string constant responseWCF jquery parsererror 未终止的字符串常量响应
【发布时间】:2025-11-21 14:55:01
【问题描述】:

对于我最近的项目,我创建了一个 Web 服务,它向 jquery 客户端代码返回一个自定义类型的数组。 WCF 被$.ajax 命令调用,并且在同一个域中。

当我在本地主机上运行我的网络应用程序(这是在本地机器上运行的 IIS)时,一切正常。当我将它部署到我们的集成服务器时,突然对 WCF 的 ajax 调用以错误结束:“parsererror - 未终止的字符串常量”和状态为 200。但是返回的消息类似于"[{\"Text\":\"Test dodatnih naslov",这当然不是正确的 json 格式.

正确的回复应该是:"[{"Text":"Test dodatnih naslovov","Value":"100"},{"Text":"Test dodatnih naslovov - ISO2","Value":"101"},{"Text":"UPDATE","Value":"102"}]"

我已经跟踪了 WCf 服务的故障,但它似乎没有崩溃。我也尝试将超时设置为 ajax 调用,但无济于事。一些帮助将不胜感激。

我的 IIS 是 IIS7,集成在 Windows Server 2008 上运行 IIS6。

js文件

function InsuranceClientContact_ItemsRequesting(o, e) {
    var $ = $telerik.$;
    var urlSvc = ServiceBaseUrl + '/GetContacts'
    $.ajax({
        type: "POST",
        url: urlSvc,
        data: '{"ixClient": ' + selectedItemId + '}', //selectedItemId is a positive number
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            // do something
        },
        error: function (result) {
            var msg = result.status + " - " + result.statusText;
            setTimeout(function () { throw new Error(msg) }, 0);
        }
    });

wcf 接口

namespace Sid.Skode.Web.Services.Populate {
    [ServiceContract]
    public interface IInsuranceClientContactService {
        [OperationContract]
        [WebInvoke(Method="POST",
            BodyStyle=WebMessageBodyStyle.WrappedRequest,
            ResponseFormat=WebMessageFormat.Json)]
        Contact[] GetContacts(long ixClient);
    }

    [DataContract]
    public class Contact {
        [DataMember]
        public string Text;
        [DataMember]
        public string Value;
    }

}

wcf 服务实现

namespace Sid.Skode.Web.Services.Populate {
    [AspNetCompatibilityRequirements( RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed )]
    public class InsuranceClientContactService : IInsuranceClientContactService {

        public Contact[] GetContacts( long ixClient ) {
            return GetContactsFromDatabase( ixClient );
        }

        #region Private methods

        private Contact[] GetContactsFromDatabase( long ixClient ) {
            DataTable dt = GetDataFromDataBaseById( ixClient );
            return ConvertDataTableToContactArray( dt );
        }        

        private DataTable GetDataFromDataBaseById( long ixClient ) {
            AutoCompleteBLL model = new AutoCompleteBLL();
            return model.SearchContactsByPartner( ixClient );
        }

        private Contact[] ConvertDataTableToContactArray( DataTable dt ) {
            Contact[] rgContact = new Contact[dt.Rows.Count];
            int cnContact = 0;
            foreach (DataRow dr in dt.Rows) {
                if (!dr.IsNull( "NAZIV" )) {
                    Contact contact = new Contact();
                    contact.Text = dr["NAZIV"].ToString();
                    contact.Value = dr["ID_DODATEN_KONTAKT"].ToString();
                    rgContact[cnContact++] = contact;
                }
            }
            return rgContact;
        }

        #endregion

    }
}

web.config wcf 部分

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="httpServiceBehavior">
          <serviceMetadata httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="httpEndpointBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding name="webHttpBindingWithTransportWindowsSecurity">
          <security mode="Transport">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="false" aspNetCompatibilityEnabled="true" />
    <services>
      <service name="Sid.Skode.Web.Services.Populate.InsuranceClientContactService" behaviorConfiguration="httpServiceBehavior">
        <endpoint address="" binding="webHttpBinding" bindingConfiguration="webHttpBindingWithTransportWindowsSecurity"
                  contract="Sid.Skode.Web.Services.Populate.IInsuranceClientContactService"
                  behaviorConfiguration="httpEndpointBehavior">
        </endpoint>
        <endpoint
          address="mex"
          binding="mexHttpsBinding"
          bindingConfiguration=""
          contract="IMetadataExchange"/>
      </service>
    </services>
  </system.serviceModel>

【问题讨论】:

    标签: wcf


    【解决方案1】:

    here 所述,您需要从 Web 配置中删除所有 RadCompression http 模块实例。然后,它起作用了。

    【讨论】:

      最近更新 更多