Web API 自托管客户端配置

Posted

技术标签:

【中文标题】Web API 自托管客户端配置【英文标题】:Web API self hosted client configuration 【发布时间】:2018-07-21 20:40:25 【问题描述】:

我设法在控制台应用程序中使用 OWIN 运行我的自托管 WEP API,方法是使用如下代码启动它:

//string baseAddress = "http://192.168.1.6:8111/";
string baseAddress = "http://+:8111/";

// Start OWIN host 
using (Microsoft.Owin.Hosting.WebApp.Start<Startup>(url: baseAddress))

    Console.ReadLine();

通过在服务主机上使用和注册像“http://+:9000/”这样的地址,我们的想法是为主机使用通用 IP 地址,这样在主机 IP 可能发生变化时不会影响客户端。

客户端位于运行服务的机器之外的其他机器上。类似于 LAN 中的移动电话或 LAN 中的另一台笔记本电脑,如果可能的话,将来还会出现在 LAN 之外。

在我的自托管服务的客户端(一个 html 页面)中,我有一个 javascript 代码,例如:

//var uri = 'http://192.168.1.6:8111/api/tests';
var uri = 'http://+:8111/api/tests';

function Read()

    $.getJSON(uri + '/' + id)

通过使用客户端中主机的静态注释 IP 地址,我可以访问自托管的 WEB API,但是当我尝试使用通用的“http://+:9000/api/tests”时,它无法连接到服务。

有没有办法通过使用这种通用配置从客户端连接到服务? 或者我应该如何配置服务主机和客户端,以便主机上的 IP 更改不会停止客户端上的服务?

我需要考虑到我的自托管机器的 IP 地址可能会更改,并且客户端将失去连接,因为它们将使用服务主机的旧 IP 地址。

【问题讨论】:

这就是 DNS 的用途:为 IP 地址注册名称。否则你什么也做不了。 + 仅用于绑定,在实际 URL 中是不允许的。最好是如果您可以使主机 IP 不变。或者你需要某种形式的发现系统。 感谢您的回复!所以应该在主机上创建 DNS,但据我了解,这需要主机的 IP 是静态的? 客户端需要找到主机的方法。如果您不能保证主机具有静态 IP,则需要某种发现系统。或者您可以使用动态 DNS。 @RasmusW,我不确定什么是动态 DNS,你能给我一个链接吗? 您好,所有客户端都可以解析域名。例如,与您的 android 客户端可以看到google.com 的方式相同,他们可以看到您的域名。对于 LAN,在本地 DNS 服务器上注册该名称就足够了,您无需在全局范围内注册该名称。 【参考方案1】:

如果客户端在同一个局域网内,您可以通过名称而不是 IP 地址来请求主机。

要查找主机名,请在主机上打开命令提示符并键入:hostname

它将显示主机名,例如myhost。然后您可以将其请求为 http://myhost:8111 或任何端口。

对于局域网之外的客户端,您必须使用 DNS。或者如果可以选择通过 *** 连接。

【讨论】:

您好,非常感谢您的建议!我尝试了类似的方法,使用@Lex Li 在上面的评论中建议的主机的完整域名,对于在 Windows 机器上运行的客户端,它工作正常(主机 IP 更改不会影响客户端)。但例如对于运行 Android 的手机客户端,这不起作用,只有当使用主机的 IP 地址(可能会更改)时,该服务才能在移动 Android 设备上正常工作。可能 Android 设备不知道识别 Windows 主机名...我不知道为什么。 @Clock 这似乎是 Android 特有的问题。看看这个:android.stackexchange.com/questions/52140/… 感谢您提供的链接,我会检查它! 您还应该确保防火墙没有阻止 还有一件事要问,据我了解,我了解到来自 DNS 旁边的主机的服务,也可以从将客户端带到本地的 *** 访问服务主机的网络,这样行不行,你觉得呢?【参考方案2】:

在您的***示例中,您托管了一个侦听特定端口的服务,您声明无论请求如何找到服务器、直接 IP、DNS 解析或您有什么,如果它是通过 http 和在端口 8111 上,然后通过您的代码发送它。

在您的第二个示例 javascript 中,您正在发出请求。此请求不能说将此请求发送到端口 8111 上的任何 IP。看到区别了吗?

我假设提供 javascript 的服务器也是您希望连接的服务器。如果是这种情况,有两种选择:

    只需将 javascript 中的 uri 值更改为:var uri = '/api/tests'; 使您的 javascript 动态化,并让它使用生成包含 javascript 网页的请求中的 Request.Url.Authority。由于我不知道您使用什么来交付 javascript,因此我将避免举例。

如果不是这样,那么您需要了解客户端需要知道在哪里制作此 api/test/id

【讨论】:

以上是关于Web API 自托管客户端配置的主要内容,如果未能解决你的问题,请参考以下文章

如何在自托管 Web API 应用程序中配置 OData 端点

如何在 Azure Service Fabric 中的自托管 Web API 上配置 SSL

强大的自托管服务器的最佳选择:WCF 与 ASP.NET Web Api

带有点网核心的自托管进程内 Web API

如何将 Windows 身份验证凭据从客户端传递到 Web API 服务

BotVS配置管理—使用新浪云搭建托管者