我正在运行一个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)
(注意:在你认为这是重复之前,请阅读问题的结尾 - 我已经完成了我的作业,然后来到这里寻求帮助)
使用HttpWebRequest
,cURL
或使用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用于生产环境。
<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 -anb
时的结果:
这是netstat -na | find '51515'
:
我不确定这些值是什么意思所以我可以在这里使用一些输入。 Just to make确定我已从Internet断开连接并禁用了防火墙和防病毒扫描程序,但没有结果。
这些是我的Internet Options设置。如您所见,所有内容都已签出:
我尝试使用web / app.config文件中的代理设置进行各种组合。我不认为这会在解决问题方面发挥重要作用,因为我的Golang应用程序存在同样的问题(这只是Postman生成的代码片段)。我甚至尝试通过将网址设置为http://127.0.0.1:8888来使用Fiddler作为代理。正如所料,WebRequest
实例的任何服务器端代理都没有帮助。
<system.net>
<defaultProxy>
<proxy usesystemdefault="False"/>
</defaultProxy>
</system.net>
鉴于有关此主题的众多问题,我看到的唯一显着差异是我在我的网址中使用了子域名。每当我不使用子域时,一切都很完美!
如果这个假设看起来是正确的,我如何欺骗DNS,防火墙或任何其他阻止机制来接受来自子域的请求?也许代理可以帮助?
答案 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就像魅力一样。