zoukankan      html  css  js  c++  java
  • 【WCF--初入江湖】12 WCF与Ajax编程

    12 WCF与Ajax编程

    Ajax

        Ajax基本原理

           AJAX技术的本质原理就是:使用 JavaScript 的 XMLHttpRequest 对象来直接与服务器进行通信。

       通过这个对象,JavaScript 可在不重载页面的情况与 Web 服务器交换数据。然后通过DOM更新部分页面数据。

           Ajax最大的优点

          在于它带来的更好的用户体验。传统的web页面请求不同,AJAX技术当提交表单时就向web服务器发送一个请求。

        服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,

        因为在前後两个页面中的大部分HTML代码往往是相同的。AJAX 在浏览器与 Web 服务器之间使用异步数据传输(HTTP 请求),

        这样就可使网页从服务器请求少量的信息,而不是整个页面。

    ajax调用WCF 

        WCF服务,为了能使js调用,必须为服务实现类(因为AspNetCompatibilityRequirements只对类有效)设置AspNetCompatibilityRequirements为Allowed,使得

      WCF跟AspNet的技术相兼容。

        WCF虽然在设计上可以进行独立传输,但当应用于一个ASP.NET AJAX应用程序环境下时,

      WCF服务实际上可以工作在一种十分类似于ASMX服务的方式下。

      借助于这个AspNetCompatibilityRequirements属性,我们可以指示WCF使用与ASMX服务相同的模型进行工作。

      

      注意,要实现WCF服务与ASMX服务的兼容性至少要实现两点。

        第一,在配置文件web.config中,需要进行类似如下的声明式定义: 

    <system.serviceModel> 
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
    </system.serviceModel> 

        第二,开发者需要显式地选择一个给定WCF服务的兼容性方式,这是通过使用服务AspNetCompatibilityRequirements属性完成的。 

    新建一个WCF应用程序项目:

    IServer.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.Security.Cryptography.X509Certificates;
    using System.ServiceModel;
    using System.ServiceModel.Activation;
    using System.ServiceModel.Web;
    using System.Text;
    
    namespace Keasy5.WCF.Ajax.Service
    {
        [ServiceContract]
        public interface IService1
        {
            [OperationContract]
            string GetData(string value);
        }
    }

    Service1.svc.cs

    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;
    using Keasy5.WCF.Ajax.Service;
    
    namespace Keasy5.WCF.Ajax.Service
    {
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]       
        public class Service1 : IService1
        {
            public string GetData(string value)
            {
                return string.Format("Hi:{0}", value);
            }
        }
    }

    服务端配置:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    
      <system.web>
        <compilation debug="true" targetFramework="4.0" />
      </system.web>
      <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior>
              <serviceMetadata httpGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
          </serviceBehaviors>
    
          <endpointBehaviors>
            <behavior name="enableWebScript_ajax">
              <enableWebScript />
            </behavior>
          </endpointBehaviors>
          
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" 
                                   aspNetCompatibilityEnabled="true"/>
    
        <services>
          <service name="Keasy5.WCF.Ajax.Service.Service1">
            <endpoint address=""
                      behaviorConfiguration="enableWebScript_ajax"
                      binding="webHttpBinding"
                      contract="Keasy5.WCF.Ajax.Service.IService1"></endpoint>
          </service>
        </services>
        
      </system.serviceModel>
     <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
        <directoryBrowse enabled="true"/>
      </system.webServer>
    
    </configuration>

      右键Service1.svc--在浏览器中查看,在原来的地址中加入“/js”,修改地址为:

        http://localhost:18476/Service1.svc/js

      WCF 服务返回:

    Type.registerNamespace('tempuri.org');
    tempuri.org.IService1=function() {
    tempuri.org.IService1.initializeBase(this);
    this._timeout = 0;
    this._userContext = null;
    this._succeeded = null;
    this._failed = null;
    }
    tempuri.org.IService1.prototype={
    _get_path:function() {
     var p = this.get_path();
     if (p) return p;
     else return tempuri.org.IService1._staticInstance.get_path();},
    GetData:function(value,succeededCallback, failedCallback, userContext) {
    return this._invoke(this._get_path(), 'GetData',false,{value:value},succeededCallback,failedCallback,userContext); }}
    tempuri.org.IService1.registerClass('tempuri.org.IService1',Sys.Net.WebServiceProxy);
    tempuri.org.IService1._staticInstance = new tempuri.org.IService1();
    tempuri.org.IService1.set_path = function(value) { tempuri.org.IService1._staticInstance.set_path(value); }
    tempuri.org.IService1.get_path = function() { return tempuri.org.IService1._staticInstance.get_path(); }
    tempuri.org.IService1.set_timeout = function(value) { tempuri.org.IService1._staticInstance.set_timeout(value); }
    tempuri.org.IService1.get_timeout = function() { return tempuri.org.IService1._staticInstance.get_timeout(); }
    tempuri.org.IService1.set_defaultUserContext = function(value) { tempuri.org.IService1._staticInstance.set_defaultUserContext(value); }
    tempuri.org.IService1.get_defaultUserContext = function() { return tempuri.org.IService1._staticInstance.get_defaultUserContext(); }
    tempuri.org.IService1.set_defaultSucceededCallback = function(value) { tempuri.org.IService1._staticInstance.set_defaultSucceededCallback(value); }
    tempuri.org.IService1.get_defaultSucceededCallback = function() { return tempuri.org.IService1._staticInstance.get_defaultSucceededCallback(); }
    tempuri.org.IService1.set_defaultFailedCallback = function(value) { tempuri.org.IService1._staticInstance.set_defaultFailedCallback(value); }
    tempuri.org.IService1.get_defaultFailedCallback = function() { return tempuri.org.IService1._staticInstance.get_defaultFailedCallback(); }
    tempuri.org.IService1.set_enableJsonp = function(value) { tempuri.org.IService1._staticInstance.set_enableJsonp(value); }
    tempuri.org.IService1.get_enableJsonp = function() { return tempuri.org.IService1._staticInstance.get_enableJsonp(); }
    tempuri.org.IService1.set_jsonpCallbackParameter = function(value) { tempuri.org.IService1._staticInstance.set_jsonpCallbackParameter(value); }
    tempuri.org.IService1.get_jsonpCallbackParameter = function() { return tempuri.org.IService1._staticInstance.get_jsonpCallbackParameter(); }
    tempuri.org.IService1.set_path("http://localhost:18476/Service1.svc");
    tempuri.org.IService1.GetData= function(value,onSuccess,onFailed,userContext) {tempuri.org.IService1._staticInstance.GetData(value,onSuccess,onFailed,userContext); }

      可以看成是服务端调用的代理类。

    示例1:用户验证

    示例2:滚动图片新闻

    【The end】

  • 相关阅读:
    游标cursor
    SQL: EXISTS
    LeetCode Reverse Integer
    LeetCode Same Tree
    LeetCode Maximum Depth of Binary Tree
    LeetCode 3Sum Closest
    LeetCode Linked List Cycle
    LeetCode Best Time to Buy and Sell Stock II
    LeetCode Balanced Binary Tree
    LeetCode Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/easy5weikai/p/3825367.html
Copyright © 2011-2022 走看看