如何将 2 个或多个 Http 隧道(例如 ngrok)与 2 个或多个 .net 不同的应用程序(需要处理图形 api 的不同订阅)一起使用?

Posted

技术标签:

【中文标题】如何将 2 个或多个 Http 隧道(例如 ngrok)与 2 个或多个 .net 不同的应用程序(需要处理图形 api 的不同订阅)一起使用?【英文标题】:how to use 2 or more Http tunnels (e.g. ngrok) with 2 or more .net different apps (needed to handle different subscriptions for graph api)? 【发布时间】:2021-10-24 00:34:10 【问题描述】:

我在过去几周开始工作(或尝试)Simple MVC-App 用于通知。

我使用了这个例子并用 ngrok 建立了 iP-tunnels ot localhost。(参见下面的示例和内容页面)。 https://docs.microsoft.com/de-de/learn/modules/msgraph-changenotifications-trackchanges/5-exercise-change-notification

https://github.com/microsoftgraph/msgraph-training-changenotifications/tree/live

如果我同时只在本地应用程序上运行一切都很好,但如果我要启动第二个通知应用程序 这条消息失败了

System.IO.IOException: Failed to bind to address https://127.0.0.1:5001: address already in use. ---> Microsoft.AspNetCore.Connections.AddressInUseException: Normalerweise darf jede Socketadresse (Protokoll, Netzwerkadresse oder Anschluss) nur jeweils einmal verwendet werden.

我在 ngrok.yml 文件中尝试了一些更改,但也无法访问。

# Create 3 tunnels, each for different ports, with only https enabled
# This way the ngrok process stays bellow the Free plan limit (4 tunnels)

authtoken: **************************
log: ngrok.log
tunnels:
  first:
    addr: 5000
    proto: http
    #host_header: localhost
  second:
    addr: 5000
    proto: http
    #host_header: localhost

我试图更改 appsetting.json 中的 url 但它不起作用:


    "Logging": 
      "LogLevel": 
        "Default": "Debug"
      
    ,
    "AllowedHosts":"*",
    "MyConfig": 
    "AppId": "****************",
    "AppSecret": "*********************",
    "TenantId": "********",
    "Ngrok": "https://76bd76a6aca4.ngrok.io"
  

但是在启动第一个应用程序后,第二个应用程序因异常而崩溃。 然后我尝试使用端口 5000 m 5010 等等并更改了launchsetting.json中的设置但我又失败了。

"msgraphapp": 
  "commandName": "Project",
  "launchBrowser": true,
  "launchUrl": "api/values",
  "applicationUrl": "https://localhost:5001;http://localhost:5000",
  "environmentVariables": 
    "ASPNETCORE_ENVIRONMENT": "Development"

请有人告诉我我必须做什么,以便我可以在 localhost 上启动 2 个或更多应用程序,并使用 ngrok 或替代方案进行隧道传输。

【问题讨论】:

出于好奇,为什么在使用 Graph Change Notifications 时需要为同一个应用程序运行两个实例并为每个实例运行一个 Ngrok 隧道? @danstan:不是同一个应用程序和类似应用程序,用于通知其他订阅另一个资源的 webhook。确实不同的 GUID 不一样,但我需要不同的应用程序来处理不同的通知。最好的情况是可以在同一台电脑本地完成。我再次更改标题以使其更清晰。 @danstan;与我的通话记录通知的实际问题无关,一个应用程序运行在一个应用程序或 afew uswer 进行日志记录和测试是一种正常情况。如果那时需要在本地对另一个应用程序进行简短测试,有时可能会发生。是的,在完全不同的应用程序上,使用相同的隧道是没有问题的。但是 URL/api/notifications 是由微软修复的,所以如果我没记错的话,它们的 URi 是不可更改的。 【参考方案1】:

您一定关注了Exercise - Azure AD apps .NET core web APIs。让两个应用程序运行并公开两个 Ngrok 隧道以获取图形更改通知

首先配置您的 ~/.ngrok2/ngrok.yml,如下所示。注意不同的端口。

authtoken: ****...***
tunnels:
  first:
    addr: 5000
    proto: http
  second:
    addr: 5010
    proto: http%

第二次编辑您的每个应用程序属性以具有不同的 http 和 https 绑定端口集。请参阅下面的屏幕截图,其中显示了每个文件的 launchSettings.json 设置。

这样您应该能够运行两个 .net 应用程序,每个应用程序都具有用于 MS 图形的 Ngrok 隧道。

记得在每个 appSettings 中添加正确的 Ngrok url

【讨论】:

乐于助人,尝试像截图一样设置,看看是否有效。您仍然可以参与评论以获得更好的理解。如果它解决了您的问题以帮助其他人,请考虑接受并支持答案。 谢谢,我做了大部分相同的事情,它适用于第一个应用程序。我没有选择多租户,我只选择了单租户。而且我不确定这些步骤: * dotnet add package Microsoft.Identity.Client * dotnet add package Microsoft.Graph * dotnet dev-certs https --trust 我想我忘记了最后一步,但我似乎可以工作。 ngrok.yml 中的 adddr:5000 我将第一个更改为 5001,然后更改为 5010(因为 https 的 lauchsetting 使用了 5001)我写了我试过这个。我尝试更改“applicationUrl”,但没有成功。我对 1 个应用程序使用了相同的应用程序注册。这会是个问题吗? 我不这么认为。每个应用程序(即使 appid 是同一个实例)都将从给定的applicationUrl 开始,并根据给定的Ngrok url 处理通知。只要 .net 应用程序实例在不同的端口上运行并且 Ngrok url 隧道连接到相应的端口,它应该可以工作。 sorry 1 条评论是简短的:在 ngrok.yml 中,您使用端口 1st:5000 和 2nd:5001,但在 launchsettings.json 中,您使用 5000,5001 作为第一个和第二个 5010,5011。是复制粘贴错误吗?我昨天都试过了,没有将launchsettings.json更改为5010,它崩溃了,更改tro 5010,5011在启动时出现了另一个异常。我希望我可以试试你很快发布的这个例子,看看我的构建中是否有问题。 ngrok.yml 使用 5000 和 5010,launchsettings.json for app1 使用 localhost:5011;http://localhost:5010,launchsettings.json for app2 使用 localhost:5001;http://localhost:5000

以上是关于如何将 2 个或多个 Http 隧道(例如 ngrok)与 2 个或多个 .net 不同的应用程序(需要处理图形 api 的不同订阅)一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中以 2 个或多个连续空格分割字符串

Neo4j:匹配多个标签(2个或更多)

如何编写 http 隧道

如何测试多个(2个或更多)布尔值是不是为真

如何测试不同 VM 上的 2 个或多个客户端之间的交互?

iOS 将 2 个或多个音频文件合并(混合)为 wav 格式