【问题标题】:How can I call a method when my web API is initialized?初始化 Web API 时如何调用方法?
【发布时间】:2020-01-12 05:13:43
【问题描述】:

我正在构建一个 Web API,它将作为第 3 方应用程序和我的应用程序之间的连接器。 此应用程序将在服务器上运行,并将接收来自第 3 方应用程序的 POST 请求并发送它自己的 POST 请求作为响应。

在它开始发送这些请求之前,我的 Web API 需要向 3rd-party 服务发送一个 POST,因此它可以注册并接收一个授权令牌,它将用于它发回的请求,有点类似据我了解,到 OAuth 令牌。

由于我的代码都在 HttpPost 方法中,它只有在收到调用时才会被激活,并且该部分按预期工作。当服务通过身份验证并正在接收请求时,就可以了。问题是当我的服务或第 3 方重新启动时,当前令牌无效或丢失,需要再次请求新令牌。

我希望在服务启动时自动发送注册我的服务并接收令牌的调用。

目前我正在手动调用以在需要注册我的服务时触发,但这使得我必须在我的计算机上这样做,并且在我调用该请求之前不会建立连接。

这是我的代码示例:

public class Controller : ApiController
    {

        static string SessionToken = "";

        [HttpPost]
        [Route("connector/webhook")]
        public async Task<HttpStatusCode> Webhook(UpdateContentRequestBody body)
        {
            var NO_ERROR = 0;

            try
            {
                if (string.IsNullOrEmpty(SessionToken))
                {
                    // This registers my service. 
                    var registerConector = ConectorOSCCApi.RegisterConector();

                    if (respostaRegistrarConector.ErrorCode != NO_ERROR)
                    {
                        throw new Exception();
                    }

                    SessionToken = registerConector.SessionToken;
                }

                ConectorApi.KeepAliveRequest(SessionToken);
                RepeatKeepAlive();

                ProccessDataAndSendResponseRequest(body);

                return HttpStatusCode.OK;
            }

            catch (Exception e)
            {
                SessionToken = "";
                return HttpStatusCode.InternalServerError;
            }

我希望注册服务的方法无需调用“连接器/webhook”即可运行,但其余处理和响应仅在收到此类调用时发生。我该怎么做?

编辑: 我的代码位于 ASP.NET Web 应用程序中。 我正在使用 .NET Framework 4.5 并在 IIS 上托管我的 Web 应用程序。

【问题讨论】:

  • 这是完整的 .net 框架还是 .net 核心?您如何引导应用程序?
  • 我将使用该信息编辑我的问题
  • 将布尔值添加到设置为 false 的类中。发出请求时检查布尔值是否为假,只有在假时才启动服务。启动服务后设置 boolean true 这样您就不会尝试再次启动服务。
  • @jdweng。好的。但是我的代码是否仍然需要被请求调用才能启动整个逻辑?
  • 取决于您想要启动服务的时间。布尔值可以放在任何类中,如果属性是public static,任何类都可以检查Controller中的布尔值。

标签: c# asp.net-web-api


【解决方案1】:

您无需等待对服务的请求即可请求令牌。

先决条件:如果您的令牌不再正确,请确保您知道从第三方 API 收到的错误代码。

当您的 API 初始化时,您将有一个可用的方法,ApplicationStart 或 Startup.cs 中的其他内容,具体取决于版本、设置等。使用该方法从第三方 API 请求令牌。将令牌缓存在应用程序级缓存中。

可以在此处找到缓存示例:Caching Data in Web API

当您的应用程序收到请求时,从缓存中获取令牌并发出对第三方 API 的调用。如果一切正常,快乐的日子。如果它失败并显示令牌颁发错误代码,则重新发出令牌请求并使用新令牌重试。用新的令牌替换缓存的令牌。

所以基本上,一直使用一个令牌直到它失败,然后自动请求一个新的并更新它。这样您就不需要在现场手动请求令牌。

您可以将此令牌逻辑包装到一个服务类中,这样您就不必在端点中做很多事情了。

【讨论】:

    【解决方案2】:

    这应该为你做:)

    public class Controller : ApiController
    {
    
            static string _sessionToken = "";
            static string SessionToken
            {
                get
                {
                    if (string.IsNullOrEmpty(_sessionToken))
                    {
                        InitToken();
                    }
                    return _sessionToken
                }
            }       
    
            void InitToken()
            {
            if (string.IsNullOrEmpty(_sessionToken))
                    {
                        // This registers my service. 
                        var registerConector = ConectorOSCCApi.RegisterConector();
    
                        if (respostaRegistrarConector.ErrorCode != NO_ERROR)
                        {
                            throw new Exception();
                        }
    
                        _sessionToken = registerConector.SessionToken;
                    }
            }
    
            public Controller() : base()
            {
                InitToken();
                // anything else
            }
    
    
            [HttpPost]
            [Route("connector/webhook")]
            public async Task<HttpStatusCode> Webhook(UpdateContentRequestBody body)
            {
                var NO_ERROR = 0;
    
                try
                {
                    ConectorApi.KeepAliveRequest(SessionToken);
                    RepeatKeepAlive();
    
                    ProccessDataAndSendResponseRequest(body);
    
                    return HttpStatusCode.OK;
                }
    
                catch (Exception e)
                {
                    SessionToken = "";
                    return HttpStatusCode.InternalServerError;
                }
            }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-09-30
      • 2018-11-30
      • 1970-01-01
      • 2016-08-13
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      相关资源
      最近更新 更多