c# - 控制台托管 WCF 服务 Http 可在 mono 和 IIS 下访问

标签 c# wcf apache iis mono

我目前正在开发一个项目并尝试了解 WCF Web 服务。

我有一个托管 WCF 服务的控制台应用程序。我已经在 <baseAddress> 中添加了应该可以访问的 URL App.config 文件的部分。当我在 Visual Studio 中以 Debug模式运行控制台应用程序时,我收到一个弹出窗口,显示 your services have been hosted .

如果我在 Visual Studio 之外运行我的应用程序并转到无法连接的 URL,我猜我需要进行一些配置才能使其正常工作,但找不到我需要执行的操作。

我有两个问题,如何使用 IIS for Windows 通过 http://访问控制台应用程序中托管的 WCF 服务,并使用 Mono C# 和 Apache Web 服务器使其可用。

感谢您提供的任何帮助。

最佳答案

在 IIS 中托管 - 用于测试

要在 IIS 中托管该服务,您需要创建一个虚拟目录。有两种方法可以做到这一点:

为了方便测试:

  • 在 Visual Studio 中右键单击您的 WCF 服务项目,选择“属性”/“Web”
  • 在其中选择“使用本地 IIS Web 服务器”。
  • 请勿启用“使用 IIS Express”。
  • 项目 URL 是您的服务器在网络上可见的地址,即。 http://yourhost/somepath/
  • 点击“创建虚拟目录”(您可能需要以管理员身份运行 Visual Studio,但这一步只需执行一次,日常使用不需要管理员权限)。

之后,您的虚拟目录已设置完毕,IIS 会将所有对 http://yourhost/somepath 的请求定向到您的 WCF 服务。请注意,这将指向项目目录中 Visual Studio 生成的二进制文件,因此重建将自动进行。

这是最简单的开发和测试选项,您甚至不需要打开 Visual Studio,但您所做的任何更改都会自动反射(reflect)到已部署的实例。

在 IIS 中托管 - 用于生产

对于生产环境,您需要创建一个真实的虚拟目录。为此:

  • 创建一个用于托管服务的目录,例如“C:\inetpub\yoursite\yourservice\”,这可以是文件系统上的任何目录。
  • 将您的 Web 服务复制到此目录中(Visual Studio 有某种方法可以自动执行此操作,但我从未使用过它,所以不太知道它是如何工作的)。
  • 打开“Internet 信息服务 (IIS) 管理器”(需要以管理员身份运行)
  • 在左侧 Pane 中,您将看到已配置的 IIS 实例和站点。如果您第一次运行此程序并且左侧 Pane 为空(应该有一个默认站点),只需右键单击并选择“添加网站”即可。
  • 右键单击您的网站,选择“添加虚拟目录”。别名是新目录的可见名称,例如 http://yoursite/alias/ ,物理路径仅指向您部署服务的目录。

自托管

您的控制台应用程序称为自托管。如果这在 Visual Studio 之外不起作用,则通常是您的 app.config 有问题。我有一个简单的例子here .

使用 Mono 托管

对于 Mono,您有三个选择:

  1. 自托管
  2. Apache 与 mod-mono 用于生产
  3. 带有 mod-mono 的 Apache 使用当前目录进行测试

自托管意味着创建一个简单的控制台应用程序来执行一些操作

var host = new System.ServiceModel.ServiceHost(typeof(MyService));
host.Open();
Console.WriteLine("Service running");
foreach (var se in host.Description.Endpoints)
    Console.WriteLine(se.Address);
Console.ReadLine();
host.Close();

并在命令行上使用 Mono 运行它。

参见Cannot access WCF service hosted in Apache with mod-mono了解如何使用 mod-mono 设置 apache,包括一些示例。

这里还有两个选项:要么将服务复制到 Apache 选取的某个目录中,要么也可以手动启动 mod-mono-server 并指定任意目录,例如当前用于测试。

关于c# - 控制台托管 WCF 服务 Http 可在 mono 和 IIS 下访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13542013/

相关文章:

apache - mod_rewrite 转换为小写并将 + 替换为 -

java - 是否可以在 Mersenne Twister RNG (Java) 中指定 nextInt 的上限和下限

c# - 在 VS2010 中调试 COM dll

c# - Web Api,如何从 HttpResponseMessage 返回枚举文本值而不是枚举索引值

c# - Mock 测试时找不到合约名称。

c# - WCF 的字符串太长

c# - 为什么执行lambda表达式中的方法

c# - 想从 mysql 表中添加一个带有 gridview(行)总和的数据,但它显示 - 在 vs05,c# 中使用未分配的局部变量 'a' 错误?

wcf 添加服务引用配置

php - 增加 php 的执行时间