对wcf的Ajax调用返回未定义

时间:2019-05-08 12:04:37

标签: javascript jquery json ajax wcf

我正在尝试使用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>

2 个答案:

答案 0 :(得分:0)

不确定您为什么会遇到此问题,我已经复制了您的代码并进行了测试,但可以得到答复。

下面是我的代码。

    [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;
        }


    }

结果。 enter image description here

答案 1 :(得分:0)

在添加

后有效
<webHttp defaultOutgoingResponseFormat="Json" />

了解web.config中的服务行为