创建网站服务(Web Services)
创建网站服务(Web Services)
除了调用网站服务之外,我们还可以在 F# 中创建网站服务,这也非常简单。事实上,当创建一个网站服务时,主要问题可能是通过网站服务器暴露代码。网站服务器以 URL 的形式,接收对于文件的请求,我们必须告诉网站服务器,这个请求将映射到哪一个 .NET类。通常,用 .asmx 文件运行特定的 F# 类,将响应对这个网站服务的请求,如果网站服务器获得一个对这个 .asmx 文件的请求。准确的实现方法取决于你的开发环境,和托管你服务的这个网站服务器。
Visual Studio 2005 带有一个内置的网站服务器,因此,创建一个新网站站点,大约只是择文件-新建-网站,然后,选择这个网站的位置。
这个站点将只运行那些用 C# 或者 Visual Basic .NET 中写出页面,因此,还需要把 F# 项目添加到这个解决方案中,然后,手工修改这个解决方案文件,以便它驻留在这个网站目录中。听上去复杂,做起来很更容易。只需要复制 .fsharpp 文件到网站目录,用记事本打开 .sln 文件,修改这个 .fsharpp 文件的路径。之后,只需要配置这个项目文件输出库,写到 bin 子目录。
这似乎要一定的努力,但之后,只要按下 F5 就行了,你的项目将自动编译并运行。
如果没有 Visual Studio 2005,那么下一步要做的最好事情就是在互联网信息服务(IIS,微软自己的用于 Windows 的网站服务器)中托管这个站点。在某种意义上,这个比托管在 Visual Studio 中更容易,但并不方便,只是编码一旦完成,就能执行代码了。为了在 IIS 中托管代码,需要创建一个 IIS 的虚拟目录,有一个子目录 bin。然后,需要复制你的 .asmx 页面和 web.config 文件到这个虚拟目录中。
注意 用 ASP.NET 来处理 F# 和 Apache 是可能,但比起使用或者不使用 Visual Studio 2005,情况要更困难一些,更多细节参见下面的页面: http://strangelights.com/FSharp/Foundations/default.aspx/fsharpfoundations.hostingwebservices。
服务本身很简单。可能就是一个类,继承自 System.Web.Service.WebService,有一个无参数构造函数。也可能标志为system.web.service.webserviceattribute。如果打算公开地暴露网站服务,必须设置这个属性的 Namespace,默认是http://tempuri.org,即使不打算公开暴露服务,设置这个属性也对网站服务有更多的可管理性。那么,这个类的成员可以成为网站方法,通过简单地标志为 system.web.service.webserviceattribute。它也有大量有用属性,设置 Description 属性特别值得,这样,服务的客户端就能知道他们将获得什么。
清单 10–6 展示了一个简单网站服务的定义。创建有一个成员 Addition 的类型服务,必须有参数,以元组的风格出现。
清单 10-6 创建一个简单网站服务
#light
namespace Strangelights.WebServices
open System.Web.Services
#r "System.EnterpriseServices.dll"
open System.EnterpriseServices
[<WebService(Namespace =
"http://strangelights.com/FSharp/Foundations/WebServices")>]
type Service = class
inherit WebService
new() = {}
[<WebMethod(Description = "Performs integer addition")>]
member this.Addition (x : int, y : int) = x + y
end
要想让网站服务器发现网站服务,需要对创建一个 .asmx文件。下面是一个.asmx 文件的示例,最重要事情是为你服务的类名设置Class 属性。当服务器接收一个对这个文件的请求,就调用适当的服务。
<%@ WebService Class="Strangelights.WebServices.Service" %>
如果你在本地运行这个服务,要测试这个服务,只需通过简单在浏览器中打开它。在浏览器中,将看到的界面如图 10-3 所示,它允许你为这个网站服务的参数给定值,并调用这个服务。
图 10-3 调用本地的网站服务