在Html页面中使用Javascript调用Wcf服务

Jay*_*yce 6 html javascript c# wcf jquery

我在VSStudio2012中有一个WCF项目,我想从JavaScript函数调用一个方法.

JavaScript文件:

var url = 'http://localhost:52768/Service1.svc/'

function test() {

var response;

$.ajax({
    type: 'Post',
    url: url + 'GetTEST',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    success: function (msg) {
        alert(msg);
    },

    error: function (e) {
        alert("Error  : " + e.statusText);
    }
});
Run Code Online (Sandbox Code Playgroud)

}

HTML文件:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script Language="JavaScript" src="Scripts/JavaScript1.js"></script>
<script Language="JavaScript" src="Scripts/jquery-1.10.2.min.js"></script>
<script Language="JavaScript" src="Scripts/jquery-1.9.1.intellisense.js"></script>
<script Language="JavaScript" src="Scripts/jquery-1.9.1.js"></script>
<script Language="JavaScript" src="Scripts/jquery-1.9.1.min.js"></script>
<script Language="JavaScript" src="Scripts/jquery.unobtrusive-ajax.js"></script>
<script Language="JavaScript" src="Scripts/jquery.unobtrusive-ajax.min.js"></script>
<script Language="JavaScript" src="Scripts/jquery.validate.js"></script>
<script Language="JavaScript" src="Scripts/jquery.validate.min.js"></script>
<title>TESTE</title>
</head>
<body>
<input id="Button1" type="button" value="button" onclick="test()"/>
</body>

</html>
Run Code Online (Sandbox Code Playgroud)

在我的IService1.cs中

    [OperationContract]
    [WebInvoke(Method = "GET",ResponseFormat = WebMessageFormat.Json)]
    string GetTEST();
Run Code Online (Sandbox Code Playgroud)

这是警报显示

在此输入图像描述

而错误:

在此输入图像描述

localhost:52768/Service1.svc显示

在此输入图像描述

chr*_*dam 12

基于这篇文章,问题是AJAX具有跨站点限制,阻止您调用远程服务.对于这种情况,一个简单的解决方法是在同一应用程序中定义服务器端page_method(脚本回调)或本地wcf服务,该服务使用服务器端代码来调用远程WCF服务.并且您的网页使用AJAX来调用本地WCF服务(其作用类似于中介).

另一种方法是将远程WCF服务定义为接受http GET请求的标准REST服务.因此,您的网页可以使用JQuery api通过JQuery脚本访问远程WCF服务操作.然后,您将WCF服务作为控制台应用程序托管,并在另一个Web应用程序中使用JQuery来调用它:

  [ServiceContract(Namespace="ConsoleAJAXWCF")]
  public interface IService1
  {
    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json)]
    string GetTEST();
  }

  [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
  public class Service1 : IService1
  {

    public string GetTEST()
    {
      return "OKKKKKKKK";
    }
  }
Run Code Online (Sandbox Code Playgroud)

您托管控制台应用程序

// program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description; 
using ConsoleAJAXWCF;    

namespace ConsoleAJAXWCF
{
    class Program
    {
        static void Main(string[] args)
        {

            // Step 1 Add a service endpoint.
            using (WebServiceHost selfHost = new WebServiceHost(typeof(Service1)))
            {
                try
                {
                   // Step 2 Start the service.
                   selfHost.Open();
                   Console.WriteLine("The service is ready.");
                   Console.WriteLine("Press <ENTER> to terminate service.");
                   Console.WriteLine();
                   Console.ReadLine();

                   // Close the ServiceHostBase to shutdown the service.
                   selfHost.Close();
                }
                catch (CommunicationException ce)
                {
                    Console.WriteLine("An exception occurred: {0}", ce.Message);
                    selfHost.Abort();
                }                
            }            
        }
    }
}
    // WCF Configuration    
   <endpointBehaviors>
      <behavior name="AJAXEndpoint" >
       <webHttp/>
       </behavior>
     </endpointBehaviors>
    </behaviors>
    <services>
      <service name="ConsoleAJAXWCF.Service1">
        <endpoint 
         behaviorConfiguration="AJAXEndpoint" 
         address="" binding="webHttpBinding" contract="ConsoleAJAXWCF.IService1">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:52768/Service1/"/>
          </baseAddresses>
        </host>
      </service>
    </services>
Run Code Online (Sandbox Code Playgroud)

验证服务是否正常工作:

  1. 从Visual Studio 2012内部运行ConsoleAJAXWCF控制台应用程序.在Windows Vista和更高版本的操作系统上运行时,必须以管理员权限运行该服务.由于Visual Studio以管理员权限运行,因此GettingStartedHost也以管理员权限运行.您还可以启动以管理员权限运行它的新命令提示符,并在其中运行service.exe.
  2. 打开Internet Explorer并浏览到本地主机的服务调试页面:52768/Service1/

调用服务的ASPX页面中的代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
      <script Language="JavaScript" src="Scripts/jquery-1.10.2.min.js"></script>
      <script Language="JavaScript" src="Scripts/jquery-1.9.1.intellisense.js"></script>
      <script Language="JavaScript" src="Scripts/jquery.unobtrusive-ajax.js"></script>
      <script Language="JavaScript" src="Scripts/jquery.unobtrusive-ajax.min.js"></script>
      <script Language="JavaScript" src="Scripts/jquery.validate.js"></script>
      <title>TESTE</title>
   </head>
   <body>
       <input id="Button1" type="button" value="button" onclick="CallRESTWCFService()"/>
   </body>
   <script type="text/javascript">

    function CallRESTWCFService() {
      $.getJSON("http://localhost:52768/Service1/GetTEST", {},
        function (data) {
          alert(data);
        });       
    }
  </script>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 问题中的服务已经是REST.使用控制台应用程序作为WCF服务的本地客户端只是一种设计选择,并不构成对REST实现的返工. (2认同)