怎样用VC开发WEB SERVICE??

leidiang 2002-01-22 05:39:29
不知,用现有的VC++程序,如何加入WEB SERVICE的支持??
是如何开发的?
...全文
235 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
masterz 2002-04-26
  • 打赏
  • 举报
回复
======================作为 ATL 开发人员使用 SOAP=============
ATL Server Web 服务为 C++ 开发人员提供了一个用本机代码创建和使用 Web 服务的简便方法。对于要在 Internet 上公开和使用 Web 服务的 C++ 开发人员来说,ATL Server 是首选方法。它已被设计为用于 Web 应用程序库(包括 SOAP 服务)的快速、轻量并具有高度灵活性的库。

ATL Server 之所以使用 ATL 作为名称,是因为它体现了 ATL 的高性能和高度灵活性的目标。例如,可以很容易地放弃 ATL Server HTTP 模型并编写自己的发送器,而同时仍然使用 ATL Server 封送/协议代码的优点。

ATL Server Web 服务使用类似于 COM 的语法来描述接口,这使当前的 ATL 开发人员易于学习。类似于 COM 的语法使开发人员可以轻松地将一个对象同时作为 COM 对象和 Web 服务公开。

属性的引入大大简化了代码,这对于非 ATL 开发人员来说同样简单得多。ATL Server 被设计为可以与其他所有 .NET Web 服务交互操作,这就便于开发人员在一个应用程序中使用多种技术。

接口。新的接口关键字使开发人员可以轻松地为 COM 对象或 Web 服务创建接口。

[
uuid("D7DAE6FD-AEBB-4579-BD8D-866F74139501"),
object
]
__interface IWeb_Service_ExampleService
{
[id(1)] HRESULT HelloWorld([in] BSTR bstrInput, [out, retval] BSTR *bstrOutput);
};

这是 ATL Server 使您能够定义 Web 服务接口的方法。通过使用 C++ 属性、内联 IDL 属性和新的 __interface 关键字,ATL Server Web 服务接口极其类似于新的属性化版本的 COM 接口。这里是一个 Web 服务接口示例 IWeb_Service_ExampleService,它实现了一个方法,即 HelloWorld。HelloWorld 将 BSTR 用作输入并将 BSTR 作为输出返回。

请求处理程序。请求处理程序是一个 C++ 类,该类通过处理程序映射公开,并具有通过替换方法映射公开的方法。处理程序映射仅仅是文本标记和类名之间的映射,而方法映射只是文本标记和类中方法之间的映射。

[
request_handler(name="Default",sdl="GenWeb_Service_ExampleServiceSDL"),
soap_handler(
name="Web_Service_ExampleService",
namespace="urn:Web_Service_ExampleService",
protocol="soap"
)
]
class CWeb_Service_ExampleService:
public IWeb_Service_ExampleService
{
public:

[ soap_method ]
HRESULT HelloWorld(BSTR bstrInput, BSTR *bstrOutput)
{
CComBSTR bstrOut(L"Hello ");
bstrOut += bstrInput;
bstrOut += L"!";
*bstrOutput = bstrOut.Detach();

return S_OK;
}
};

ATL Server 请求处理程序模型极其类似于 Web 应用程序和 Web 服务

下面显示了请求处理模型:

http request--->IIS--->ISAPI--->APP DLL

HTTP 请求进入 IIS,然后 IIS 根据 URL 和扩展名将请求映射到适当的 ISAPI DLL。接下来,ISAPI DLL 将请求中指定的处理程序(处理程序在标记或查询参数中指定)映射到适当的应用程序 DLL。应用程序 DLL 将此处理程序映射到 C++ 对象。在此模型(即 ATL Server 模型)中,Web 应用程序和 Web 服务之间的唯一区别就在于这最后一个步骤。在 Web 服务中,C++ 对象能够对 SOAP 进行解码/编码(执行此操作的代码由编译器在分析 soap_handler 属性时插入)。

您可以看到我们的类是从我们的接口继承的,并且使用了 [soap_method] 属性来指示 HelloWorld 方法将处理 SOAP 请求。同实现其他任何 C++ 方法一样实现此方法。

soap_handler 属性还确保自动生成描述服务的有效 WSDL。此服务描述(其格式为 XML/WSDL)由 Web 服务的使用者使用以确保他们以正确的格式发送/接收正确的数据。

通过 ATL Server 使用 Web 服务
通过 ATL Server 使用 Web 服务同样是一个比较简单的操作。开发人员使用“添加 Web 引用”对话框,然后使其指向 .disco 文件,该文件又指向 WSDL,其方法与使用任何其他类型的 Web 引用相同。该对话框在后台运行 Web 服务的 WSDL 上的 sproxy.exe 实用工具(对于非本机 .NET Web 服务来说使用的是另一种实用工具)。

此操作将创建 Web 服务代理文件,该文件包含使用所请求的 Web服务所需的所有 C++ 代码。使用 WSDL 中的信息,代理生成器可以计算出 Web 服务期望接收到的和将返回到客户端的信息。然后就使代理生成器可以创建能够与 Web 服务“对话”的头文件。

只需要创建 Web Service 类(存在于生成的头文件中)的实例并使用适当的方法。例如:

CWeb_Service_ExampleServiceService MyService;
CComBSTR bstrOut;
CComBSTR bstrIn(L"World");
MyService.HelloWorld ( bstrIn ,&bstrOut,);
wprintf(bstrOut);

此时您便拥有了一个基本的 ATL Server Web 服务和一个基本的 ATL Server Web 服务使用者
masterz 2002-04-26
  • 打赏
  • 举报
回复
==================================作为组件开发人员使用 SOAP============================
Microsoft .NET 远程处理使需要高度控制并希望在紧耦合与松耦合之间进行选择的开发人员能够创建分布式应用程序。

同时还提供了与公共语言运行库的深度集成,并为开发人员提供在整个网络中的完全类型系统兼容性。这包括构造函数、委托、重载方法、通过值和通过引用传递对象、类层次结构、接口、方法、属性、字段、通过值(复制)和通过引用(传递 ObjRef)使用任何可插接式信道在网络上的应用程序(Web 服务)之间封送对象、分布式标识、激活、基于租约的生存期和 CallContext(在独立于参数的 SOAP 标头中的流对象)。

使用 .NET 远程处理使开发人员能够从任何进程公开远程处理端点,包括控制台应用程序、GUI 应用程序、NT 服务和 IIS。这发生在使用任何有效负载编码(具有可插接式序列化格式化程序和产品中提供的 SOAP 和二进制格式化程序)的任何传输(具有可插接式信道)上。SOAP=HTTP+XML 是优选策略,它具有对 HTTP 和 SMTP 上的 SOAP 1.1 的完全支持。

有使 WSDL 可以描述 Web 服务和完全运行库类型系统兼容性的支持。.NET 远程处理在 .NET SDK 中提供了 soapsuds 工具,该工具用于从托管类和 COM 对象的元数据中生成服务描述。soapsuds 工具也使用服务描述并生成元数据和代理。提供了丰富的侦听模型,使开发人员能够在消息流入或流出应用程序时插入自己的行为。同时为想要进行深入研究的人们提供了具有二进制编码的使用套接字的 TCP 信道。

.NET 远程处理用于远程处理托管组件、本机 COM/COM+ 组件以及接受服务的组件(即由 COM+ Services 提供服务的托管组件)。所有这一切适用于 SOAP、二进制以及任何可插接式信道和格式。

示例:SOAP 上的托管代码事件
下面的代码说明托管代码事件是如何在两个应用程序之间激发的。客户端有一个本地对象,它将此对象注册以用于与远程对象进行事件通知。当调用服务器对象时,它将激发该事件。这导致对客户端的本地对象的回调。

服务器端
zap.cs
using System;

namespace Zap
{
// Define the event arguments
public class GreetingEventArgs : EventArgs
{
public GreetingEventArgs(string greeting)
{
this.greeting = greeting;
}

public string greeting;
}

// Define the event
public delegate void GreetingEvent(object sender,
GreetingEventArgs e);

// Define the Service
public class Waz : MarshalByRefObject
{
// The client will subscribe and
// unsubscribe to this event
public event GreetingEvent Greeting;

// Method called remotely by client
public void HelloMethod(string greeting)
{
Console.WriteLine("Received String {0}", greeting);

// Package String in GreetingEventArgs
GreetingEventArgs e = new GreetingEventArgs(greeting);

// Fire Event
if (Greeting != null)
{
Greeting(this, e);
}
}
}
}

host.cs

using System;
using System.IO;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.HTTP;

public class Host
{
public static void Main(string[] args)
{
// Manually load the http channel.
// This could also be done in the remoting configuration file.
ChannelServices.RegisterChannel(new HTTPChannel(999));

// Register the wellknown server type.
// This could also done in the remoting configuration file.
RemotingServices.RegisterWellKnownType(
"Zap", // Assembly
"Zap.Waz", // Full type name
"host/Waz.soap", // URI
WellKnownObjectMode.Singleton); // Object Mode

// We are done, wait until the user wants to exit
Console.WriteLine("Host is ready to process remote messages.");
Console.WriteLine("Press ENTER to exit");
String keyState = Console.ReadLine();
}
}

客户端
client.cs

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.HTTP;

using Zap;

// Local Marshal by Ref Object onto which
// the event will be fired
public class Baz : MarshalByRefObject
{
public void GreetingHandler(object sender, GreetingEventArgs e)
{
Console.WriteLine("GreetingHandler callback : Greeting : {0}\n",
e.greeting);
}
}

public class Client
{
public static void Main(String[] args)
{
Baz baz = new Baz();

// This could also be done with a Remoting configuration file

// Registe the HTTP Channel
ChannelServices.RegisterChannel(new HTTPChannel(0));

// Obtain a Proxy to the SOAP URL
Waz waz = (Waz)Activator.GetObject(
typeof(Waz),
"http://localhost:999/host/Waz.soap"
);


// Subscribe to event : occurs over SOAP
waz.Greeting += new GreetingEvent(baz.GreetingHandler);

for (int i = 0; i < 5; i++)
{
// Occurs over SOAP to waz)
waz.HelloMethod("Bill" + " " + i);
}

// Unsubscribe to event : occurs over SOAP
waz.Greeting -= new GreetingEvent(baz.GreetingHandler);
}
}

生成文件
makefile

all: Host.exe Zap.dll Client.exe

Host.exe: Host.cs
csc /r:System.Runtime.Remoting.dll Host.cs

Zap.dll: Zap.cs
csc /t:library -out:Zap.dll Zap.cs

Client.exe: Zap.dll Client.cs
csc /r:System.Runtime.Remoting.dll /r:Zap.dll Client.cs

在一个窗口中启动 host.exe,然后在另一个窗口中启动 client.exe。您将会看到事件被激发回客户端的情形。

这是众多 .NET 远程处理应用程序的一个示例,此示例在网络上提供了完全 CLR 托管代码类型系统。因为 .NET 远程处理完全符合 SOAP 1.1,所以它也是一个优秀的 SOAP 服务器和客户端

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧