Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 400错误请求-在本地进行自托管Web API调用时主机名无效_C#_Owin_Nancy - Fatal编程技术网

C# 400错误请求-在本地进行自托管Web API调用时主机名无效

C# 400错误请求-在本地进行自托管Web API调用时主机名无效,c#,owin,nancy,C#,Owin,Nancy,我正在通过nancy/owin在windows服务中对一个网站进行自维护。该网站可以很好地托管,我可以在本地和其他机器的浏览器中访问该网站。与站点交互时,对我的Web API端点的所有调用都可以正常工作 当试图通过另一个应用程序本地访问Web API端点时,就会出现问题——除非我使用IP地址连接。例如,我有一个控制台应用程序,我在其中发出一个简单的GET请求。如果我使用机器名(基本名或完全限定名)或本地主机在本地运行应用程序,则会收到400个错误请求-无效主机名。如果我使用IP地址执行相同的请求

我正在通过nancy/owin在windows服务中对一个网站进行自维护。该网站可以很好地托管,我可以在本地和其他机器的浏览器中访问该网站。与站点交互时,对我的Web API端点的所有调用都可以正常工作

当试图通过另一个应用程序本地访问Web API端点时,就会出现问题——除非我使用IP地址连接。例如,我有一个控制台应用程序,我在其中发出一个简单的GET请求。如果我使用机器名(基本名或完全限定名)或本地主机在本地运行应用程序,则会收到400个错误请求-无效主机名。如果我使用IP地址执行相同的请求,它可以正常工作。另一方面,如果我在同一域的另一台计算机上运行console应用程序,无论我使用哪个主机名,它都会工作。两台机器上的防火墙都已关闭。这可能是什么原因造成的

以下是我用来注册URL的代码:

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();
}

Nancy可能在您发布此问题后有所改变,但根据我的经验,这与
HostConfiguration.RewriteLocalhost
设置有关。当我将其设置为
false
时,得到的行为与您看到的相同

HostConfiguration.RewriteLocalhost=true
时,我还需要使用
netsh http add urlacl URL=http://+:port user=

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();