我通过nancy / owin在Windows服务中自建网站。该站点可以很好地托管,我可以在本地或从另一台计算机的浏览器中访问该站点。与网站交互时,对Web API端点的所有调用都可以正常工作。
尝试通过另一个应用程序在本地访问Web API端点时会出现问题-除非我使用IP地址进行连接。例如,我有一个控制台应用程序,在这里我进行了一个简单的GET请求。如果我使用计算机名称(基本名称或标准名称)或本地主机在本地运行该应用程序,则会收到400错误的请求-无效的主机名。如果我使用IP地址执行相同的请求,则效果很好。另一方面,如果我在同一域的另一台计算机上运行控制台应用程序,则无论我使用哪个主机名,它都将起作用。两台计算机上的防火墙均关闭。是什么原因造成的?
这是我用来注册网址的代码:
public void Start(int port = 1234)
{
// Get URIS with port num
var uris = GetUriParams(port);
// Add Host URLs
var startOptions = new Microsoft.Owin.Hosting.StartOptions();
foreach (var uri in uris)
startOptions.Urls.Add(uri.ToString());
// Start OWIN
this._owinApp = WebApp.Start<Startup>(startOptions);
}
private static Uri[] GetUriParams(int port)
{
var uriParams = new List<Uri>();
string hostName = Dns.GetHostName();
// Host name URI
string hostNameUri = string.Format("http://{0}:{1}", Dns.GetHostName(), port);
uriParams.Add(new Uri(hostNameUri));
// Host address URI(s)
var hostEntry = Dns.GetHostEntry(hostName);
foreach (var ipAddress in hostEntry.AddressList)
{
if (ipAddress.AddressFamily == AddressFamily.InterNetwork) // IPv4 addresses only
{
var addrBytes = ipAddress.GetAddressBytes();
string hostAddressUri = string.Format("http://{0}.{1}.{2}.{3}:{4}", addrBytes[0], addrBytes[1], addrBytes[2], addrBytes[3], port);
uriParams.Add(new Uri(hostAddressUri));
}
}
// Localhost URI
uriParams.Add(new Uri(string.Format("http://localhost:{0}", port)));
return uriParams.ToArray();
}
这是我在控制台应用程序中发出的Web请求:
var getDataFormatString = "http://{0}:{1}/API/MyService/GetData";
var fqdn = "mymachine";
var address = string.Format(getDataFormatString, fqdn, 1234);
var request = (HttpWebRequest)WebRequest.Create(new Uri(address));
request.Method = "GET";
request.Credentials = new NetworkCredential("username", "password", "domain");
var response = (HttpWebResponse)request.GetResponse();
最佳答案
自您发布此问题以来,南希可能已更改,但是以我的经验,这与HostConfiguration.RewriteLocalhost
设置有关。当我将此设置为false
时,您会看到相同的行为。
当HostConfiguration.RewriteLocalhost=true
时,我还需要使用netsh http add urlacl url=http://+:port user=<appropriate-user>
创建URL保留
关于c# - 400错误的请求-在本地进行nancy自托管的Web API调用时无效的主机名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38884006/