初始化Web API时如何调用方法?

时间:2019-09-10 12:33:18

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

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

在开始发送这些请求之前,我的Web API需要对第三方服务进行POST,因此可以对其进行注册并接收授权令牌,该令牌将用于返回给它的请求,类似据我了解,是OAuth令牌。

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

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

当前,我正在进行手动调用以在需要注册我的服务时触发,但是这使我有必要在我的计算机上进行注册,并且只有在我调用该请求后才能建立连接。

这是我的代码示例:

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,并将Web应用程序托管在IIS上。

2 个答案:

答案 0 :(得分:0)

这应该为您做到:)

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

答案 1 :(得分:0)

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

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

初始化API时,根据版本,设置等,您将在Startup.cs中有一个可用的方法,ApplicationStart或其他方法。请使用该方法向第三方API请求令牌。将令牌缓存在应用程序级别缓存中。

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

当您的应用程序收到请求时,请从缓存中获取令牌,然后将调用发出给第三方API。如果一切正常,请开心。如果它失败并出现令牌发行错误代码,则重新发出令牌请求,然后使用新令牌再次尝试。用新的令牌替换缓存的令牌。

因此,基本上,继续使用令牌直到令牌失效,然后自动请求一个新令牌并对其进行更新。这样,您无需手动请求令牌。

您可以将此令牌逻辑包装到服务类中,因此在端点上没有太多事情要做。

相关问题