【问题标题】:Ajax call to wcf is returning undefined对 wcf 的 Ajax 调用返回未定义
【发布时间】:2019-05-08 12:04:36
【问题描述】:

我正在尝试使用 ajax 调用 WCF 服务公开的函数,但成功方法始终返回“未定义”,即使 WCF 端的函数本身返回正确答案 我尝试调试和打印所有内容,WCF 正在返回正确的答案,但是当 ajax 调用进入它收到的成功方法对象时,它是未定义的

WCF:

 [OperationContract]
        [ WebInvoke (
        Method = "POST",
        BodyStyle = WebMessageBodyStyle.WrappedRequest,
        ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json
        )]

        public Result_Login LoginAdmin(string email, string password)
        {

            System.Diagnostics.Debug.WriteLine("LoginAdmin called");


            #region Declaration And Initialization Section.
            Result_Login resultLogin = new Result_Login();
            #endregion

            #region Body Section
            try
            {
                BLC.BLC oBLC_Default = new BLC.BLC();
                BLCInitializer oBLCInitializer = new BLCInitializer();
                oBLCInitializer.ConnectionString = ConfigurationManager.AppSettings["CONN_STR"];
                System.Diagnostics.Debug.WriteLine("Connection string: "+ConfigurationManager.AppSettings["CONN_STR"]);
                using(BLC.BLC oBLC = new BLC.BLC(oBLCInitializer))
                {
                    resultLogin.login = oBLC.SignInAdmin(email, password);
                }
            }
            catch(Exception ex)
            {
                if(ex.GetType().FullName != "BLC.BLCException")
                {
                    resultLogin.ExceptionMsg = string.Format("Get_Persons : {0}", ex.Message);
                }
                else
                {
                    resultLogin.ExceptionMsg = ex.Message;
                }
            }
            #endregion
            #region Return Section
            return resultLogin;//giving the right result before ajax return method
            #endregion
        }

        public override string ToString()
        {
            return base.ToString();
        }

        // Add more operations here and mark them with [OperationContract]
    }

    #region Action_Result
    public partial class Action_Result
    {
        #region Properties.
        public string ExceptionMsg { get; set; }
        #endregion
        #region Constructor
        public Action_Result()
        {
            #region Declaration And Initialization Section.
            #endregion
            #region Body Section.
            this.ExceptionMsg = string.Empty;
            #endregion
        }
        #endregion
    }
    #endregion

    #region Result_Login
    public partial class Result_Login : Action_Result
    {
        #region Properties.
        public bool login { get; set; }
        #endregion
    }

Javascript:

function IsAuthenticated_JSON() {
    try {
        _Params1 = new Object();
        _Params1.email = $("#Login1_UserName").val();
        _Params1.password = $("#Login1_Password").val();
        _Params = JSON.stringify(_Params1);
        _Service_Method = "LoginAdmin";
        CallService(_Service_Method, IsClientAuthenticated_Completed, Service_Call_InCompleted);

    }
    catch (e) {
        alert("IsAuthenticated_JSON: " + e.Message);
    }
}
function IsClientAuthenticated_Completed(i_Input) {
    try {
        localStorage.setItem("UserInfo", JSON.stringify(i_Input.My_Result));
        console.log("unstringify: " + JSON.stringify(i_Input.My_Result));//undefined
        if (localStorage.getItem('UserInfo') != null) {
            _UserInfo = JSON.parse(localStorage.getItem('UserInfo'));
            _Ticket = _UserInfo.Ticket;
            alert("done");
        }
    }
    catch (e) {
        console.log("error "+e.Message + " " + e.log)
    }
}
function CallService(i_Service_Method, i_Success_Method, i_Failure_Method) {
    var url = "";
    url = js_Prepare_WCF_Url_For_Call();

    var request = $.ajax({
        type: "POST",
        url: url,
        data: _Params,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: true,
        success: function (msg) {
            console.log("data: "+msg.data +"status: "+ msg.status +"message: " + msg.Message);//undefined
            i_Success_Method(msg);
        },
        error: function (msg) {
            console.log("fail: " + msg.responseText + msg.statusText)
        }
    });
}

Web.config:

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  https://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="FuelAppEntities" connectionString="metadata=res://*/DALC.csdl|res://*/DALC.ssdl|res://*/DALC.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=FuelApp;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>


  <appSettings>
    <add key="CONN_STR" value="Data Source=.;Database=FuelApp;User ID=sa;Password=sa" />
  </appSettings>

  <system.web>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1" />
  </system.web>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="project.Service1AspNetAjaxBehavior">
          <enableWebScript />
        </behavior>
                <behavior name="My_Behavior">
                    <webHttp defaultOutgoingResponseFormat="Json" />
                </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="true" />
                </behavior>
            </serviceBehaviors>
    </behaviors>
    <bindings>
            <customBinding>
                <binding name="project.WCF.customBinding0">
                    <binaryMessageEncoding />
                    <httpTransport />
                </binding>
            </customBinding>
            <webHttpBinding>
                <binding maxBufferPoolSize="1048576" maxReceivedMessageSize="1048576" maxBufferSize="1048576" name="jsonpWebHttpBinding" useDefaultWebProxy="false" crossDomainScriptAccessEnabled="false" />
            </webHttpBinding>
        </bindings>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" minFreeMemoryPercentageToActivateService="0"/>
    <services>
      <service name="project.WCF">
        <endpoint address="a" behaviorConfiguration="project.Service1AspNetAjaxBehavior"
          binding="webHttpBinding" contract="project.WCF" />
                <endpoint address="" binding="webHttpBinding" bindingConfiguration="jsonpWebHttpBinding" contract="project.WCF" behaviorConfiguration="My_Behavior" />
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="PushSharp.Apple" publicKeyToken="cf74b75eab2c0170" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.2.1.0" newVersion="2.2.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="PushSharp.Android" publicKeyToken="cf74b75eab2c0170" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.2.1.0" newVersion="2.2.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="PushSharp.WindowsPhone" publicKeyToken="cf74b75eab2c0170" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.2.1.0" newVersion="2.2.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="PushSharp.Blackberry" publicKeyToken="cf74b75eab2c0170" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.2.1.0" newVersion="2.2.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="PushSharp.Windows" publicKeyToken="cf74b75eab2c0170" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.2.1.0" newVersion="2.2.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

【问题讨论】:

    标签: javascript jquery json ajax wcf


    【解决方案1】:

    不知道你为什么会遇到这个问题,我已经复制了你的代码并进行了测试,但我可以得到响应。

    下面是我的代码。

        [ServiceContract]
    public class MyTestRestService
    {
        [OperationContract]
        [WebInvoke(
        Method = "POST",
        BodyStyle = WebMessageBodyStyle.WrappedRequest,
        ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json
        )]
    
        public Result_Login LoginAdmin(string email, string password)
        {
    
    
    
    
            Result_Login resultLogin = new Result_Login();
            resultLogin.ExceptionMsg = "exception";
            resultLogin.login = true;
            return resultLogin;
    
        }
    
    }
    

    型号

    公共部分类 Action_Result {

        public string ExceptionMsg { get; set; }
    
        public Action_Result()
        {
    
            this.ExceptionMsg = string.Empty;
    
        }
    
    }
    
    public partial class Result_Login : Action_Result
    {
    
        public bool login { get; set; }
    
    }
    

    端点配置。

      <service  name="Service.Rest.MyTestRestService"   >
        <endpoint  binding="webHttpBinding" contract="Service.Rest.MyTestRestService" behaviorConfiguration="web"></endpoint>
      </service>
    

    启用跨域请求,如果您的 wcf REST 服务器和您的客户端不在同一个来源。

    <system.webServer>
      <httpProtocol>  
      <customHeaders>  
        <add name="Access-Control-Allow-Origin" value="*" />  
      <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS" />
        <add name="Access-Control-Allow-Headers" value="*"/>
    
      </customHeaders>  
    </httpProtocol>
    

    protected void Application_EndRequest(object sender, EventArgs e)
        {
    
         if(HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                HttpContext.Current.Response.StatusCode = 200;
            }
    
    
        }
    

    结果。

    【讨论】:

      【解决方案2】:

      添加后就可以了

      <webHttp defaultOutgoingResponseFormat="Json" />
      

      到 web.config 中的服务行为

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多