博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从Atlas到Microsoft ASP.NET AJAX(6) - Networking, Application Services
阅读量:6206 次
发布时间:2019-06-21

本文共 6739 字,大约阅读时间需要 22 分钟。

Networking



Calling Web Service Methods from Script


  为了简化Web Services方法调用,客户端代理的设计被改变了,它在方法调用和回调函数设置方面提供了强大的灵活性。


  下面的例子展示了CTP版本中Web Services方法的客户端调用,以及回调函数的使用方式。第一个例子展示了在CTP版本中Web service的定义方式。如下:

public
 
class
 MyService: System.Web.Services.WebService
{
    [WebMethod]
    
public
 
string
 MyWebMethod(
int
 param1, 
string
 param2) {
        ...
    }
}

  下一个例子展示了CTP版本中调用上述方法的客户端代码。如下:

//
 Invoke method, specifying a "succeeded" callback function.
MyNS.MyService.MyMethod(
126
"
my value
"
, OnComplete, 
    OnTimeout, OnError, onAborted, 
"
MyUserContext
"
);
//
 Callback function.
function
 OnComplete(result, response, userContext) {
    
//
 Use result.
}

  下面的两个例子展示了上述代码在RTM版本的相应的定义与使用方式。RTM版本中服务器端方法的定义方式和下面的例子类似。如下:

[ScriptService] 
public
 
class
 MyService: System.Web.Services.WebService
{
    [WebMethod]
    
public
 
string
 MyMethod(
int
 param1, 
string
 param2) {
        ...
    }
}

  RTM版本中访问服务器端方法的客户端代码与下面的例子类似。如下:

//
 Invoke method, specifying callback functions and user context.
MyNS.MyService.MyMethod(
126
"
my value
"
, OnSuccess, OnFailure, 
"
MyUserContext
"
);
//
 Callback function
function
 OnSuccess(result, userContext, methodName) {
    
//
 Use result.
}

  在RTM版本中,您能够指定一个默认的回调函数和默认的user context,这样访问Web Service方法时就无需指定那些参数了。下面的客户端代码设置了默认的回调函数和user context,然后使用不同的参数连续调用了两次Web Services方法。

var
 Fs 
=
 MyNS.MyService;
Fs.set_defaultSucceededCallback(OnSuccess);
Fs.set_defaultFailedCallback(OnFailure);
Fs.set_defaultUserContext(
"
MyUserContext
"
);
Fs.set_timeout(
100
);
//
 Invoke method without specifying callback functions or user context.
Fs.MyMethod(
126
"
value one
"
);
Fs.MyMethod(
456
"
value two
"
);


Server Attributes


  在CTP版本中,使用了.NET Framework中服务器端的自定义属性,以此对Web Services方法进行特定的控制。在RTM版本中引入了新的自定义属性来提供这些功能。这些改变的原因是考虑到安全因素,以及避免复用现有类库所带来的语义上的差别。


  针对Web Service方法的改变有:

  • 必须使用[ScriptService]自定义属性来标记Web Services类,使它的方法能够从客户端访问。
  • [ScriptIgnore]自定义属性能够用来避免某个类的属性或者实例变量被JSON序列化,从而使它们不会出现在客户端为服务器端对象生成的代理中。这个自定义属性与CTP版本中[XmlIgnore]自定义属性的作用相对应。
  • [GenerateScriptType()]自定义属性的作用是为服务器端的类型添加客户端代理,这样就可以将其作为Web Services方法的参数或返回值了。这个自定义属性可以使用在任何Web Service类和方法中。这个自定义属性与CTP版本中[XmlInclude]自定义属性的作用相对应。
Comment  在这之前其实我已经在“深入Atlas系列”中将Atlas中访问Web Services方法的主要功能讨论完了,在了解Microsoft ASP.NET AJAX针对这部分的改变之后我也去简单阅读了一下程序集的代码。这部分代码的改变并不如想象中的大(也有可能是因为我没有仔细研究其细节)。其服务器端的实现虽然进行了修改和重构,但是原有功能大致不变。另外,服务器端的功能也增强了,例如到目前为止,我发现目前的实现已经能够支持Dictionary<T, K>这样的范型字典。哎,还算是不幸中的万幸,“深入Atlas系列”中“分析”部分的文章没有完全丧失其价值,只是“示例”部分可以说真正的无一幸免……


Support for WCF Web Services


  在RTM版本里,您已经无法从客户端访问Windows Communication Foundation (WCF) Web Services(.svc文件)了。访问WCF的能力将会被一个增强的实现所替代,在接下来的“Orcas”CTP中将有对于WCF的完全集成。



Advanced Networking Scenarios Not Available in the RTM Release


  CTP版本内的下列功能在RTM版本中被取消了:

  • iframe调用。这个功能可以支持跨域名的调用,处于安全性考虑,在RTM中这项功能被移除了。
  • 下列不常用的功能:
    • 机遇程序集的方法调问。
    • InitialData控件。
    • Web Service的批量调用。


Application Services


  在RTM版本中,我们为客户端使用Authentication服务和Profile服务提供了一个简化的并且更为灵活的设计。这个设计与前面讲过的客户端访问Web Services方法保持了统一。



Profile Services


  RTM版本的Profile服务使用了Web Service客户端代理的模型,而没有单独作为一个组件而实现。但是,Value-add包内提供了一个Profile服务组件的实现。


  CTP版本和RTM版本中关于Profile服务的主要改变有以下几点:

  • 相关的类名从Sys._Profile改变为Sys.Services._ProfileService。
  • 全局实例从Sys.Profile改变为Sys.Services.ProfileService。
  • 开发人员可以为save,load和error方法指定默认的回调函数。
  • 增加了使用字符串数组作为参数的save和load方法。
  • 增加了对于Profile Group的支持。
  • 增加了使用ScriptManager和ProfileServiceManager服务器端控件预加载Profile属性的支持。
  • 去除了AutoSave功能。
  • 去除了saved,loaded和propertyChanged事件。

  Value-add包提供的Profile服务缩小了CTP版本中的Profile组件和RTM版本中Profile代理之间的距离。它有以下一些功能:

  • 类名变成了Sys.Preview.Services.Compoenents.Profile。
  • XML-Script的标签仍然是<profile />
  • 如果没有指定preloading功能的话,该组件会在页面加载时自动加载profile信息。
  • 该组件提供了AutoSave功能。
  • 该组件提供了saved和loaded事件。
  • 该组件提供了getProperty()和setProperty()方法。
  • 该组件可以作为Binding的target或source。

  下列示例展示了Profile服务的使用方式。第一个示例展示了如何加载Profile信息。如下:

//
 Load specific properties, after setting default completed
//
 and failed callback functions.
Sys.Services.ProfileService.load([
"
SimpleProperty
"
"
Group.GroupedProperty
"
]); 
//
 Load all properties marked as "read access" in the Web service,
//
 after setting default completed and failed callback functions.
Sys.Services.ProfileService.load();
//
 Specify explicit callbacks rather than using defaults. "88" is 
//
 passed to the callback function as user context.
Sys.Services.ProfileService.load(props, loadCompletedCallback, failedCallback, 
88
); 

  下面的示例展示了访问Profile属性的方法。如下:

var
 x 
=
 Sys.Services.ProfileService.properties.SimpleProperty;
var
 x 
=
 Sys.Services.ProfileService.properties.Group.GroupedProperty1;
var
 x 
=
 Sys.Services.ProfileService.properties.Group.GroupedComplexTypeProperty.AddressLine1;

  下面的示例展示了改变Profile属性的方式。如下:

Sys.Services.ProfileService.properties.SimpleProperty 
=
 
"
value
"
;
if
(
!
Sys.Services.ProfileService.properties.Group) {
      Sys.Services.ProfileService.properties.Group 
=
 
new
 Sys.Services.ProfileGroup();
}
Sys.Services.ProfileService.properties.Group.GroupedProperty1 
=
 
"
group value
"
;
Sys.Services.ProfileService.properties.Group.GroupedComplexTypeProperty 
=
 { AddressLine1: 
"
abc
"
, AddressLine2: 
"
xyz
"
 };

  下面的示例展示了保存Profile属性的方式。如下:

//
 Save specific properties, after setting default success and 
//
 fail callback functions.
Sys.Services.ProfileService.save([
"
SimpleProperty
"
"
Group.GroupedProperty
"
]); 
//
 Save all properties in the .properties object, after 
//
 setting default completed and failed callback functions.
Sys.Services.ProfileService.save(); 
//
 Specify explicit callbacks, rather than using defaults. "88" is 
//
 passed to the callback function as user context.
Sys.Services.ProfileService.save(props, saveCompletedCallback, failedCallback, 
88
);

  下面的示例展示了completed回调函数参数信息。如下:

function
 loadCompletedCallback(numPropertiesLoaded, userContext, methodName) {...} 
function
 saveCompletedCallback(numPropertiesSaved, userContext, methodName) {...}

  下面的示例展示了failed回调函数的参数信息。如下:

function
 failedCallback(errorObject, userContext, methodName) {...}



Autentication Service


  CTP版本和RTM版本中Authentication服务的改变有以下几点:

  • 您可以为login,logout和error指定默认的回调函数。
  • 在login和logout函数中,可以传递一个redirectUrl作为参数,指定操作完成后的页面转向。
  • 在login函数中,可以传递一个customInfo作为参数,这个参数为今后使用而保留,目前应该设置为null。
  • 增加了get_isLoggedIn方法。这个方法不会与服务器端交互,它只和当前组件的状况有关。如果您使用了未指定redirctUrl参数的login函数,则在login成功之后,get_isLoggedIn就会返回true。
  • 去除了verifyUser方法。

  下面的示例表示了如何在RTM版本如何使用Authentication服务。如下:

var
 loggedIn 
=
 Sys.Services.AuthenticationService.get_isLoggedIn(); 
Sys.Services.AuthenticationService.login(userLogin, userPassword, isPersistentCookie,
    customInfo, redirectUrl, loginCompletedCallback, failedCallback, userContext);
Sys.Services.AuthenticationService.logout(redirectUrl, logoutCompletedCallback, failedCallback, userContext);

  下面的示例展示了completed回调函数的参数信息。如下:

function
 loginCompleted(validCredentials, userContext, methodName) {...}

  下面的示例展示了failed回调函数的参数信息。如下:

function
 loginFailed(errorObject, userContext, methodName) {...}
本文转自 jeffz 51CTO博客,原文链接:http://blog.51cto.com/jeffz/59546,如需转载请自行联系原作者
你可能感兴趣的文章
android studio :cannot resolve symbol R
查看>>
paper 20 :color moments
查看>>
绘图笔记
查看>>
代码大全
查看>>
博客园作业4--数组
查看>>
DataTable.ImportRow()与DataTable.Rows.Add()的区别
查看>>
微信小程序左右滑动切换页面示例代码--转载
查看>>
C2 shell
查看>>
【jQuery】关于选择器中的 :first 、 :first-child 、 :first-of-type
查看>>
dom 解析xml文件
查看>>
程序集、应用程序配置及App.config和YourSoft.exe.config .
查看>>
二叉树的基本操作及应用(三)
查看>>
A SimpleDataStore
查看>>
朱晔和你聊Spring系列S1E3:Spring咖啡罐里的豆子
查看>>
IOS CALayer的属性和使用
查看>>
温故而知新:柯里化 与 bind() 的认知
查看>>
查看修改swap空间大小
查看>>
Django REST framework
查看>>
出了本练内功的书:《完美软件开发:方法与逻辑》
查看>>
C链表反转(时间复杂度O(n))
查看>>