已回答 在...之间允许请求

Raysefo

知名会员
已加入
2019年2月22日
留言内容
192
编程经验
10+
您好,

我有一个asp.net Web API。客户希望我添加一个有效的时间间隔(09:00-21:30)以便接受请求。假设某个请求是在08:00发出的,则该消息会被拒绝,并显示一条消息,指出允许在9:00 AM和21:30 PM之间进行请求。我打算按以下方式在global.asax中实现此逻辑,但是我不确定是否有更好的方法。

C#:
ublic class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            
            GlobalConfiguration.Configure(WebApiConfig.Register);
          
        }

        protected void Application_BeginRequest()
        {
            

            if (CheckTime9To2130())
            {
                //do something
            }
            else
            {
                Response.StatusCode = 429;
                Response.Write("Requests are permitted between 9:00 AM and 21:30 PM");
                Response.End();
            }
        }

        private bool CheckTime9To2130()
        {
            var h = DateTime.Now.TimeOfDay.Hours;
            var m = DateTime.Now.TimeOfDay.Minutes;

            if ((9 <= h && h <= 21) || (h == 21 && m <= 30))
            {
                return true;
            }

            return false;
        }
    }

如果客户想更改时间间隔怎么办?我需要在代码库中更改它并将其部署到服务器。因此,我认为我需要将这些时间用于config的设置中。但是它仍然有成本,当我在配置上更改它时,IIS将重新启动对吗?因此,将这些时间保留在数据库中似乎是唯一的解决方案?您有什么建议?
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
192
编程经验
10+
其实我没有任何错误。我告诉客户要我增加限制,并实施了过滤器。在过滤器中,我将返回HttpResponseMessage。该客户说他希望在我返回操作时得到回应,

C#:
return new System.Web.Http.Results.ResponseMessageResult(
                    Request.CreateErrorResponse((HttpStatusCode)222, new HttpError("No Results Found")));
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,919
地点
英国
编程经验
10+
It gave error, didn't 兑换.
其实我没有任何错误。
假设我把成龙的照片放在这里...。

认真地说,您如何确定自己犯了一个错误,但又没有错误并一口气说出来呢?你在做什么?还是不知道?还是在这里我玩游戏为我解决问题,同时我可以间接回答我被问到的问题?

附带说明,您正在尝试发回错误的错误代码。这样做只会通过向客户提供错误的标头来误导客户的应用程序,这些错误的标题与您要为其提供错误的原因无关。我认为在这个阶段,我一定会把这个链接扔给你玩: 超文本传输​​协议(HTTP)状态代码注册表 -在该链接中的哪里表明222是正确的错误标头,以发送回429响应?

429 would be more accurate. However, if you look at the HttpStatusCode., you will see that the responses you can use are limited. But these can be overridden by Casting 429, and provide a suitable message which would be more applicable. Instead of sending back "No Results Found",我认为这是错误的,应该说明用户已达到查询限制并指定了可以重试的超时期限。

您要么足够聪明,可以投放自定义错误,要么是从网络上的某个地方复制了代码,而没有正确检查所用代码的文档。我也看不到您在哪里实现了一个接口,该接口实际上会使返回下面的HttpResponse相对容易。此外,在MSDN上搜索 Web API 2中的操作结果-ASP.NET 4.x 我已经注意到我的浏览器以前曾经在此链接上,并且我之前曾告诉过您在项目的较早版本中实现此接口,在这里我又回来了。您还拥有Skydiver的上一个链接,其中还包括有关如何使用此界面的示例。

您应该做的是使用调试器并进入代码中以识别代码在做什么,然后,在MSDN上研究每种有问题的方法,然后返回论坛并报告调试器的行为。正在向您报告,并告诉我们您想实现哪种行为。准确报告错误是什么还是没有错误也很重要"convert"。而不是试图让我们四处寻找问题,而这显然需要您进行检查。我们不是在查询您的API,而是在查询;因此,我们无法精确复制您的问题。您需要花更多的精力来解释有关您遇到的问题的问题。否则,您可能会发现您的支持会迅速减少。鉴于您已获得但仍然忽略的信息,我已经忍不住了。我正在收到似曾相识的声音。

C#:
return new HttpResponseMessage(HttpStatusCode.{Your Error here});
 

Raysefo

知名会员
已加入
2019年2月22日
留言内容
192
编程经验
10+
@谢平 再次假设我将荷马·辛普森gif放在墙上,而不是理解我的要求。
  1. 我有一个过滤器属性
  2. OnAuthorization我正在返回HttpResponseMessage
C#:
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            //Check Request Start-End Period
            if (!CheckRequestTime())
            {
                var response = new HttpResponseMessage
                {
                    StatusCode = (HttpStatusCode) 429,
                    ReasonPhrase = "Invalid Request Time",
                    Content = new StringContent("Requests are permitted between " +
                                                WebConfigurationManager.AppSettings["TimeStart"].ToString() +
                                                " AM and " + WebConfigurationManager.AppSettings["TimeEnd"].ToString() +
                                                " PM.")
                

                };

                actionContext.Response = response;
                

            }
        }

3.客户端要我返回ResponseMessageResult​
C#:
{
    "Message": "Requests are permitted between 11:00 AM and 22:30 PM."
}
我只想问问是否可以在OnAuthorization中返回ResponseMessageResult而不是HttpResponseMessage?现在对您清楚吗?​
这在下面解决了我的问题;​
C#:
Content = new StringContent("{\"Message\":\"Requests are permitted between " +
                                                WebConfigurationManager.AppSettings["TimeStart"].ToString() +
                                                " AM and " + WebConfigurationManager.AppSettings["TimeEnd"].ToString() +
                                                " PM.\"}", System.Text.Encoding.UTF8, "application/json"),
 
Last edited:

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,919
地点
英国
编程经验
10+
@Sheepings再一次写文章而不是理解我的要求,假设我把荷马·辛普森的gif撞到了墙上。
首先。不。我不是为了写作而写作,而是为了解释而写作。您似乎并没有进入厚重的头骨的解释。阅读此主题的任何人都可以清楚地看到您再次陷入困境。他们还可以看到我们花了时间指出您要去哪里哪里。但是,您再一次回来向我们吐出垃圾代码,这表明没有尝试实现我和 @跳伞 told you to implement. Had you taken your head out of your ass and read the links and information which we both sent you, you would find two working examples demonstrating how you can achieve what you are needing to do; which is essentially 兑换ing from a HttpResponseMessage to a IActionResult.

其次。你得原谅我的无奈。因为很明显,你不过是一个 帮助吸血鬼。您还在寻找一份不会从我这里得到的讲义。您拒绝阅读相关文档和信息。而且您拒绝调试自己的代码。

您为此无聊地编写了自己的代码,并表现出一些血腥的努力。您应该感谢已经获得的帮助,因为这与您目前从我这里得到的帮助一样多。在对代码进行必要的建议更改之前,您将无法获得更多答复。这不是我告诉过您应该使用的第一个主题 这个介面。那是我之前给您的链接,只是您跳过了对Interface本身的阅读。

最后。如果您笨拙地实现接口,那么我们将无能为力。 Visual Studio可以为您生成界面。的 文档明确指出 您可以按照要求进行操作,但必须使用 提供的界面。因此,请启发我您在上述无关代码集中实现了任何此类接口的位置?

我要问的是是否有可能返回ResponseMessageResult而不是HttpResponseMessage
是。
这在下面解决了我的问题;
我很可怜你的客户,祝你好运。
 
最佳 底部