敬业的IT人 >> 编程开发 >> C/C++ >> 从 Managed Extensions for C++ 中使用 .NET My Ser

从 Managed Extensions for C++ 中使用 .NET My Ser

敬业的IT人 互联网 佚名 2008-1-3 20:13:22

  摘要:本白皮书将指导您编写一个使用示例 .NETMy Services 的客户端应用程序。该客户端应用程序将使用 Managed Extensions for C++、Visual Studio® .NET 和 .NET My Services 软件开发包 (SDK) 来编写。与 Visual C#™ 或 Visual Basic® 客户端应用程序相比,您还需要执行其他一些步骤。本白皮书假定您已经熟悉 Visual Studio XMLWebService 模型,该模型用于创建和使用来自客户端应用程序的一般 Web Service。

简介

  作为 Microsoft® .NET 的先行措施,Microsoft 引入了以用户为中心的体系机构和一套 XML Web Service(称为 .NET My Services,以前的代码名为“HailStorm”)。.NET My Services 建立在 Microsoft .NET Alerts 和 Microsoft .NET Passport 的功能基础之上,是一系列 XML Web Service,将于 2002 年面世。到那时候,用户将可以安全地存储个人信息并控制对个人信息的访问。.NET My Services 平台是 XML Web Service 的集合,可以使用行业标准协议(包括简单对象访问协议 [SOAP]、XML 以及通用说明、发现和集成 [UDDI])通过 Internet进行调用。NET My Services 可以对用户进行验证,可以发送警报,还可以存储个人信息,包括联系人、电子邮件、日历、配置文件、列表、电子钱包、物理位置、文档库、应用程序设置、收藏的 Web 站点、拥有的设备和接收警报的首选项。

  为了鼓励开发人员开发使用这些服务的应用程序,Microsoft 在 2001 年 10 月召开的专业开发人员会议上发布了 .NET My Services SDK。此 SDK 包含示例服务和两个公开源代码的项目,以便将 Visual Studio 与 .NET My Services 集成。这些公开源代码的项目是用 Visual C# 编写的,它们为 Visual Studio 提供了额外的功能,使用户能够无缝地处理以下示例中的 .NET My Services 的特定特性。

  首先,您应该知道 .NET My Services 使用称为 .NET Services 的中心元服务,理解这一点非常重要。在客户端和其他 .NET My Services(例如 .NET Contacts 或 .NET Wallet)之间的相互作用方面,此服务担当中介。集中化的 .NET Services 还可以代表用户对其他服务的提供进行管理,并在运行时将其他服务的位置传达给客户端。因此,在确定特定请求的地址之前,客户端应用程序必须与中心 .NET My Services 协商事务。

  .NET My Services 还使用 Kerberos 验证协议并对所有 SOAP 数据包进行加密,以确保用户私人数据的安全。这意味着,所有客户端应用程序都必须提供请求 Kerberos 验证单的功能,并且必须在所有的 SOAP 请求中显示这些验证单。同样,客户端还必须能够加密 SOAP 请求并解密SOAP 响应。

进入讨论组讨论。 访问

  .NETMy Services 服务定位器和加密中使用的所有技术都基于公开标准,并且有详尽的文档,这样,.NET My Services 开发人员就可以开发他们自己的应用程序层来处理这些功能。不过,.NET My Services SDK 包括两个可以解决这些问题的共享源代码项目。对于 Visual C# 和 Visual Basic,用户只需要在他们的客户端应用程序中包括对这些项目的引用,便可以利用这些功能。从根本上来说,这些功能允许开发人员像对其他 XMLWebService 一样来对 .NET My Services 进行编码。

注意:还需要提供一些其他措施,用于解决 Managed Extensions for C++客户端应用程序的 Add Web Reference(添加 Web 引用)对话框的局限性。其中,Managed Extensions for C++ 客户端应用程序使用了 XML Web Service(使用强类型的数据集)。在将来的 Visual Studio .NET 版本中,将不再需要这些附加措施。演练

  在此演练中,您将从 .NET My Services SDK 生成 HsSoapExtension.dll,创建简单的 Managed Extensions for C++ 客户端,还将使用示例客户端代码向您的 .NET FavoriteWebSites 添加 Web 站点。

  生成 HsSoapExtension.dll

  在 Visual Studio 中,打开集成开发环境 (IDE)。

  在 File(文件)菜单上,单击Open(打开),然后单击 Project(项目)。

  浏览 .NET My Services SDK 文件夹,并找到 HsSoapExtension 解决方案。

  单击 Open(打开)。

  在 Build(生成)菜单上,单击 Build Solution(生成解决方案)。 注意:本演练后面将用到 HsSoapExtension.dll。

  创建简单的 Managed Extensions for C++ 客户端

  在 File(文件)菜单上,单击 New(新建),然后单击 Project(项目)。

  将显示 New Project(新建项目)对话框。

  在 Project Types(项目类型)窗格中,单击 Visual C++,然后在 Templates(模板)窗格中,单击 Managed C++ Application(管理C++ 应用程序)。

  在 Name(名称)框中,输入 MyServiceClient。

  单击 OK(确定)。

  在命令行中找到 MyServiceClient 项目目录,然后运行以下命令:disco http://localhost/WSDL/myFavoriteWebSites.wsdl

  此命令将下载 soaprp.xsd 和 myFavoriteWebSites.wsdl 文件并生成 results.discomap。生成的 .discomap 文件将说明 .wsdl 和 .xsd 文件之间的依存关系。

  将生成的文件添加到项目中

  在 Solution Explorer(解决方案资源管理器)中,用右键单击项目节点。在快捷菜单中,单击 Add(添加),然后单击 Add Existing Item(添加现有项目)。

进入讨论组讨论。 访问

  找到您的项目所在的位置,然后选择以下三个文件:soaprp.xsd、myFavoriteWebSites.wsdl 和 results.discomap。

  用右键单击results.discomap 文件。在快捷菜单中,单击 Properties(属性),然后将 Tool(工具)选项的值更改为 Web Service Proxy Generator(Web Service 代理生成器)。

  再次用右键单击 results.discomap 文件。在快捷菜单中,单击 Properties(属性),然后将 Tool(工具)选项的值更改为 Custom Build Tool(自定义生成工具)。

  从 .NETMy Services SDK 解决方案文件夹中将 HsSoapExtension.dll 复制到项目的源文件夹中。

  在 csc.rsp 文件(位于 %SystemRoot%Microsoft.NETFrameworkv1.0.xxxx)中,添加以下文本:/reference:HsSoapExtension.dll

  在 Build(生成)菜单上,单击 Build Solution(生成解决方案)。

  这将生成用于 XMLWeb Service 的 C# 代理类 results.cs,并且该类将被置于 results.dll 中。

注意:对于 Managed Extensions 应用程序,所有代理类都在 C# 中生成,不管它们的目标是 .NET My Services 还是其他 Web Service。

  要使用 .NET FavoriteWebSites 服务,请在 MyServicesClient.cpp 文件中添加以下代码行:#using <HsSoapExtension.dll>
#using <references.dll>

  现在,您已经完成调用 MyService 所需的所有设置工作。下面的示例客户端代码显示了如何将 Web 站点添加到您的 .NET FavoriteWebSites 中,以及如何查询和删除 Web 站点。

  示例客户端代码

int _tmain(void)
{
  
Microsoft::Hs::ServiceLocator::ServiceLocator* serviceLocator =
 new Microsoft::Hs::ServiceLocator::ServiceLocator
 ("http://localhost/myServices", "c:\logfile.txt", true);
  try
   {
    //
    // 使用服务定位器查找并初始化 .NET
    // FavoriteWebSites 服务/代理
    //
    // 需要:如果您要查询其他用户,请指定
    // 用户名而不是调用 User.GetCurrentUser()。
    // 注意:在 ASP.NET应用中,User.GetCurrentUser
    // 将不起作用。
    //
    
   myFavoriteWebSites* myFav = dynamic_cast<myFavoriteWebSites*>
     (serviceLocator->GetService(System::Type::
      GetType("myFavoriteWebSites"),
      User::GetCurrentUser()));
   
    //
    // 创建新的收藏 Web 站点
    //
    favoriteWebSiteType* newWebsite = new favoriteWebSiteType();
    localizableString* title = new localizableString();
    title->lang = S"en";
    title->Value = S"Hello.NET";
    newWebsite->title = new localizableString*[1];
   newWebsite->title[0] =title;
    newWebsite->url = S"http://www.microsoft.com";
    catType* cat = new catType();
    cat->ref = S"system";
    newWebsite->cat = new catType*[1];
   newWebsite->cat[0] = cat;
    //
    // 创建 insertRequest 并调用 insert。
    //
    insertRequestType* insertRequest = new insertRequestType();
    // 插入到服务的根中。
    insertRequest->select=S"/";    
    insertRequest->Items = new Object*[1];
   insertRequest->Items[0] = newWebsite;
    insertResponseType* response = myFav->insert(insertRequest);
    //
    // 检查以确保操作成功。
    //
   if(response->selectedNodeCount != 1 || response->status !=
   responseStatus::success)
    {
      throw new Exception(S"将新的 favoriteWebSite 插入到 myFavoriteWebSites 中时出错。");
    }
    //
    // 在插入之后查询新的收藏 Web 站点。
    //
    queryRequestType* queryRequest = new queryRequestType();
    xpQueryType* xpQuery = new xpQueryType();
    // 注意:“m:”前缀将在当前服务的
    // SoapExtension 中自动被声明。
    xpQuery->
     select=S"/m:myFavoriteWebSites/m:favoriteWebSite
     [./m:title='Hello.NET' and ./m:url='http://www.microsoft.com']";
    // 将 xpQuery 添加到 xpQuery 数组中。
    queryRequest->xpQuery = new xpQueryType*[1];
   queryRequest->xpQuery[0] = xpQuery;
    queryResponseType* queryResponse = myFav->query(queryRequest);
    //
    // 从响应中获取返回的 favoriteWebSite。
    //
    favoriteWebSiteType* returnedWebSite =
     dynamic_cast<favoriteWebSiteType*>
     (queryResponse->xpQueryResponse[0]->Items[0]);
    
    //
    // 检查以确保操作成功。
    //      
   if(String::Compare (returnedWebSite->title[0]->Value,
   S"Hello.NET") != 0 ||
     String::Compare (queryResponse->xpQueryResponse[0]->status ,
     S"success")!= 0)
    {
      throw new Exception(S"从 myFavoriteWebSites 中检索新的 favoriteWebSite 时出错");
    }
    //
    // 在消息框中显示 Web 站点。
    //
   MessageBox::Show(String::Concat
     (S"下面的 favoriteWebSite 是从 myFavoriteWebSites 返回的:", returnedWebSite->title[0]->Value));
    
    //
    // 替换 cat/@ref 属性值
    //
    topLevelAttributeType* redAttribute = new topLevelAttributeType();
    redAttribute->name = S"ref";
    redAttribute->value = S"newvalue";
    replaceRequestType* replaceRequest = new replaceRequestType();
    replaceRequest->select=S"/m:myFavoriteWebSites/m:favoriteWebSite
     /m:cat/@ref[.='system']";
    replaceRequest->attribute = new topLevelAttributeType*[1];
   replaceRequest->attribute[0] = redAttribute;
    
    //
    // 删除 Web 站点
    //
    deleteRequestType* deleteRequest = new deleteRequestType();
    deleteRequest->
     select = S"/m:myFavoriteWebSites/m:favoriteWebSite
      [./m:title='Hello.NET' and ./m:url='http://www.microsoft.com']";
   deleteResponseType* delResponse = myFav->
       __identifier(delete)(deleteRequest);
   
    //
    // 检查以确保至少在一个元素上执行了操作
    // 并且响应显示操作成功
    //
   if(delResponse->selectedNodeCount == 0 || delResponse->status !=
       responseStatus::success)
    {
      throw new Exception(S"从 myFavoriteWebSites 中删除新的 favoriteWebSite 时出错");
    }
   MessageBox::Show(S"已成功地从 myFavoriteWebSites 中删除 favoriteWebSite");
    
    
  }
  catch(SoapException* se)
  {
    //
    // 将 SoapException 写入控制台。
    //
   Console::Write(S"出现 SoapException
异常:
");
   Console::WriteLine(se->ToString());
   Console::Write(S
从 .NET My Services 返回扩展的 SoapFault 信息:
");
   Console::Write(se->Detail->InnerXml);
  }
  catch(Exception* ex)
  {
    //
    // 将异常写入控制台。
    //
   Console::WriteLine(ex->ToString());
  }
  Console::WriteLine(S"按 Enter 键退出。" );
  Console::ReadLine();
  
  return 0;
}

进入讨论组讨论。
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com