实现jquery.ajax及原生的XMLHttpRequest调用WCF服务的方法

废话不多说,直接讲解实现步骤

一、首先我们需定义支持WEB HTTP方法调用的WCF服务契约及实现服务契约类(重点关注各attribute),代码如下:

//IAddService.cs
namespace WcfService1
{
    [ServiceContract]
    public interface IAddService
    {
        [OperationContract]
        [WebInvoke(Method="POST",RequestFormat=WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,BodyStyle=WebMessageBodyStyle.WrappedRequest)]
        int Add(int a,int b);
    }
}

//AddService.cs
namespace WcfService1
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class AddService : IAddService
    {

        public int Add(int a, int b)
        {
            return a + b;
        }

    }
}

二、然后就是创建一个WCF服务缩主的svc文件,方法有两种:

1.在.NET FRAMEWORK 4.0以前,采用如下代码:

<!--添加一个WCF服务文件(如:AddService.svc),文件内容修改成如下:-->
<%@ ServiceHost Language="C#" Debug="true" Service="WcfService1.AddService" %>

<!--配置WEB.CONFIG:-->
  <system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <bindings>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="AddServiceBehavior">
          <enableWebScript />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <services>
      <service name="WcfService1.AddService">
        <endpoint address=""  binding="webHttpBinding" contract="WcfService1.IAddService" behaviorConfiguration="AddServiceBehavior" ></endpoint>
      </service>
    </services>
  </system.serviceModel>

2.在.NET FRAMEWORK 4.0及以后,采用如下代码:(无需创建SVC文件,直接在WEB.CONFIG文件中指定一个地址,重点关注:serviceHostingEnvironment 节点)

  <system.serviceModel>
    <bindings>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
      <serviceActivations>
        <add relativeAddress="AddService.svc" service="WcfService1.AddService" factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"/>
      </serviceActivations>
    </serviceHostingEnvironment>
  </system.serviceModel>

创建好后,直接运行该工程,出现如下画面则表示运行成功:

三、在同工程下新增一个WEB页面(格式不限,ASPX,HTML都可以),然后实现WEB客户端调用WCF服务的代码,我这里分为两种方式来完成,一是采用原生的XMLHttpRequest来调用,二是采用jQuery.ajax来调用,其内部原理相同,在此只是为了让大家更清楚一些。

采用原生的XMLHttpRequest来调用代码如下:

        //简单封装一下:
        var $ = function (id) {
            return document.getElementById(id);
        };

        //获取原生的XMLHttpRequest对象
        function getXMLHTTPRequest() {
            var req = false;
            try {
                req = new XMLHttpRequest();
            } catch (err) {
                try {
                    req = new ActiveXObject("Msxml2.XMLHTTP");
                } catch (err) {
                    try {
                        req = new ActiveXObject("Microsoft.XMLHTTP");
                    } catch (err) {
                        req = false;
                    }
                }
            }
            return req;
        }

        $("btnGet").onclick = function () {

            var xmlhttp = getXMLHTTPRequest();
            xmlhttp.open("POST", "http://localhost:30348/AddService.svc/Add", true);
            xmlhttp.setRequestHeader("Content-type", "application/json");
            xmlhttp.onreadystatechange = function () {
                if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                    var r = JSON.parse(xmlhttp.responseText);
                    $("result").value = r.d;
                }
            };
            xmlhttp.send(‘{"a":‘ + $("num1").value + ‘,"b":‘ + $("num2").value + ‘}‘);
        }

采用jQuery.ajax来调用代码如下:

        var jq = jQuery.noConflict();
        jq("#btnGet").click(function () {
            alert("click");
            jq.ajax("http://localhost:30348/AddService.svc/Add", {
                type: "POST",
                //dataType: "json",
                contentType: "application/json",
                data: ‘{"a":‘ + jq("#num1").val() + ‘,"b":‘ + jq("#num2").val() + ‘}‘,
                //data: ‘a=‘ + jq("#num1").val() + ‘&b=‘ + jq("#num2").val(),
                success: function (data) {
                    jq("#result").val(data.d);
                },
                error: function (x, textStatus, errorThrown) {
                    alert(textStatus);
                }
            });
        });

最终实现效果如下:

特别说明,以上实现只支持在同一域名下进行调用,跨域调用则会报错,下次我将分享跨域调用WCF服务的方法,敬请期待,不足之处,欢迎指出,谢谢!

时间: 2024-12-07 16:00:30

实现jquery.ajax及原生的XMLHttpRequest调用WCF服务的方法的相关文章

实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法

关于ajax跨域调用WCF服务的方法很多,经过我反复的代码测试,认为如下方法是最为简便的,当然也不能说别人的方法是错误的,下面就来上代码,WCF服务定义还是延用上次的,如: namespace WcfService1 { [ServiceContract] public interface IAddService { [OperationContract] [WebInvoke(Method="GET",RequestFormat=WebMessageFormat.Json, Resp

jquery或者JavaScript调用WCF服务的方法

/****************************************************************** * Copyright (C): 一心堂集团 * CLR版本: 4.0.30319.18063 * 命名空间名称: WcfService1 * 文件名: IJoonService * GUID1: b7bd3ab3-3668-4727-9416-f9845da207e1 创建人:尹明能 * 创建时间: 2014-9-24 13:13:09 ***********

实现在GET请求下调用WCF服务时传递对象(复合类型)参数

WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原生的XMLHttpRequest调用WCF服务的方法>.<实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法>,在此就不作重述. 实现WCF支持HTTP请求调用容易,但要实现类似MVC的ACTION及WEB API那样的灵活,那就得花费点功夫,为什么这样说

ajax内调用WCF服务

WCF可以当作WebService一样被调用,在html内通过ajax调用WCF服务的方法如下: 1.新建一个WCF服务的网站项目: 2.在项目内增加一个新项:启用了ajax的WCF服务: 3.在对应的XXService.svc.cs文件内增加方法.例: [OperationContract] [WebGet] public void DoWork() { // 在此处添加操作实现 return; } 4.调用方法上必须引用[OperationContract].[WebGet]特性,否则会调用

学习调用WCF服务的各种方法

1.开发工具调用WCF 这中方法很方便也很简单,很多工作VS就帮我们完成了.相信大家也不会对这种方法陌生.这里简单提一下.打开VS,在项目中添加服务引用: 在config中自动声明了有关服务的节点信息,这样VS就创建了调用服务的代理: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->ServiceReference1.Service1Client

JavaScript调用wcf服务,并且处理返回的字典集合

1.第一步创建wcf服务的方法 using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using System.ServiceModel;using System.ServiceModel.Activation;using System.ServiceModel.Web;using System.Text; namespace WcfService1{ 

PHP调用WCF提供的方法

一.准备工作 1.安装wampserver:过程略 2.配置wampserver: 2.1打开php.ini文件,去掉 ;extension=php_soap.dll 这里那个分号. 也有说把这个 ;extension=php_openssl.dll前面的分号也去掉的. 2.2 如上图,将php_soap打上√. 2.3 如上图,打开httpd.conf文件,找到Listen 80 ,将80端口改成一个较大的端口,如8000.因为80端口也能别的程序用着. 在这个directory里面有php页

【ITOO】WCF——Client调用WCF服务

三步走已经走了两步,一个WCF服务发布好之后,就等待着用的人来调用了,它只向外提供一个接口,暴露地址和契约,不暴露服务是如何实现的.接下来就说说客户端调用WCF服务的事. 其实说到调用就很简单了,首先我们要让我们所需的服务识别我们,即配置好同样的终结点信息,然后添加服务的引用,最后调用相应的方法即可. 如配置文件中: <applicationSettings> <WebDemoClient.Properties.Settings> <setting name="We

WPF异步调用WCF服务

wpf调用wcf时,第一次访问总耗时到达几秒,影响界面的用户体验,因此在wpf加载界面和加载数据时采用异步加载,即异步访问wcf服务, 由于是否采用异步加载和服务端无关,仅仅由客户端自己根据需要来选择,则我们只需要在客户端(WPF)程序中采用异步的方法.如下: //1.创建一个异步对象,访问wcfFunc<string, string, List<NodeItem>> GetDataFromWCF = new Func<string, string, List<Node