无法建立连接,因为目标计算机主动拒绝了127.0.0.1:port子域

时间:2017-07-17 22:20:08

标签: c# asp.net-mvc httpwebrequest subdomain iis-express

我正在运行一个ASP.NET MVC 5应用程序,它也承载IdentityServer3。正如许多其他人之前经历过的那样,当我连接到这个终点时......

http://tenant1.localhost:51515/identity/.well-known/openid-configuration?client_id=backoffice&redirect_uri=http%3A%2F%2Flocalhost%3A37046%2Findex.html&response_type=id_token%20token&scope=openid%20all_claims&state=1793477650&nonce=1172967295

...我收到以下错误:

No connection could be made because the target machine actively refused it 127.0.0.1:51515 at System.Net.HttpWebRequest.GetResponse() at RestSharp.Http.GetRawResponse(HttpWebRequest request) at RestSharp.Http.GetResponse(HttpWebRequest request)

注意:在你认为这是重复之前,请阅读问题的结尾 - 我已经完成了我的作业,然后来到这里寻求帮助)

使用HttpWebRequestcURL或使用Go中的应用时,结果相同。以下是我使用的一些代码示例:

C#(使用RestSharp):

var client = new RestClient("http://tenant1.localhost:51515/identity/.well-known/openid-configuration?client_id=backoffice&redirect_uri=http%3A%2F%2Flocalhost%3A37046%2Findex.html&response_type=id_token%20token&scope=openid%20all_claims&state=1793477650&nonce=1172967295");
var request = new RestRequest(Method.GET);
request.AddHeader("postman-token", "a09c64d2-e0c6-a416-d5ad-92079f0676b9");
request.AddHeader("cache-control", "no-cache");
IRestResponse response = client.Execute(request);

卷曲:

curl -X GET \
'http://tenant1.localhost:51515/identity/.well-known/openid-configuration?client_id=backoffice&redirect_uri=http%3A%2F%2Flocalhost%3A37046%2Findex.html&response_type=id_token%20token&scope=openid%20all_claims&state=1793477650&nonce=1172967295' \
-H 'cache-control: no-cache' \
-H 'postman-token: 271bbbe6-bcb1-b999-80e5-9193f0c134ba'

我为这些示例做了一些替代方法,例如通过包含主机头(值tenant1.localhost:51515)或使用相同的uri作为Web客户端的代理。不幸的是,他们都返回了相同的错误。

奇怪的是,所有我使用浏览器或Postman成功的请求都成功了。连接到端点的JavaScript代码也可以使用。有一个一个例外:一旦我有一个Fiddler会话在运行,这就是我从Postman得到的回复:

[Fiddler] The connection to 'tenant1.localhost' failed. <br />Error: ConnectionRefused (0x274d). <br />System.Net.Sockets.SocketException No connection could be made because the target machine actively refused it 127.0.0.1:51515

我几天来一直在寻找解决方案,但我似乎无法找到合适的解决方案,但似乎很明显只有在服务器端代码中才会出现问题。这是我到目前为止所尝试的内容。我包含了applicationhost.config和hosts文件,以显示我如何启用&#39;我的Web应用程序的子域(内部用于识别租户)。此外,我使用IIS Express进行本地开发,将IIS用于生产环境。

的applicationHost.config

<site name="MyApp" id="5">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
        <virtualDirectory path="/" physicalPath="D:\Source\MyApp" />
    </application>
    <bindings>
        <binding protocol="http" bindingInformation="*:51515:localhost" />
        <binding protocol="http" bindingInformation="*:51515:tenant1.localhost" />
    </bindings>
</site> 

主机文件

127.0.0.1 tenant.localhost

Netstat

这是我执行netstat -anb时的结果:

NetStat -anb results

这是netstat -na | find '51515'

的结果

Netstat port 51515

我不确定这些值是什么意思所以我可以在这里使用一些输入。 Just to make确定我已从Internet断开连接并禁用了防火墙和防病毒扫描程序,但没有结果。

代理

这些是我的Internet Options设置。如您所见,所有内容都已签出:

Internet Options

我尝试使用web / app.config文件中的代理设置进行各种组合。我不认为这会在解决问题方面发挥重要作用,因为我的Golang应用程序存在同样的问题(这只是Postman生成的代码片段)。我甚至尝试通过将网址设置为http://127.0.0.1:8888来使用Fiddler作为代理。正如所料,WebRequest实例的任何服务器端代理都没有帮助。

<system.net>
  <defaultProxy> 
    <proxy usesystemdefault="False"/> 
  </defaultProxy>
</system.net>

Visual Studio

  • 我在VS2017中以管理员身份运行这两个项目(主机和客户端应用程序)
  • 我多次更改了托管应用程序的端口

问题

鉴于有关此主题的众多问题,我看到的唯一显着差异是我在我的网址中使用了子域名。每当我不使用子域时,一切都很完美!

如果这个假设看起来是正确的,我如何欺骗DNS,防火墙或任何其他阻止机制来接受来自子域的请求?也许代理可以帮助?

2 个答案:

答案 0 :(得分:0)

netstat输出显示仅使用IP v6地址,这不是很典型,但如果由于某种原因在计算机上未使用IP v4,则应该没问题。那么你不能指望服务器处理IP v4数据包(到127.0.0.1)。

一个快速解决方案是在主机文件中设置[::1]而不是127.0.0.1的记录。

答案 1 :(得分:0)

虽然Lex Li的回答更好,但我想为此问题提供另一种解决方案。我将C#代码示例从问题扩展到:

var client = new RestClient("http://tenant1.localhost:51515/identity/.well-known/openid-configuration?client_id=backoffice&redirect_uri=http%3A%2F%2Flocalhost%3A37046%2Findex.html&response_type=id_token%20token&scope=openid%20all_claims&state=1793477650&nonce=1172967295");
client.Proxy = new WebProxy("http://localhost:51515");

var request = new RestRequest(Method.GET);
request.AddHeader("postman-token", "a09c64d2-e0c6-a416-d5ad-92079f0676b9");
request.AddHeader("cache-control", "no-cache");
IRestResponse response = client.Execute(request);

所以回答我自己的问题:是的,代理可以提供帮助。通过使用不包含子域的URI向RestClient添加代理,webrequest就像魅力一样。