How to pass a datetime parameter?

后端 未结 10 1722
暗喜
暗喜 2020-11-29 01:56

How to pass UTC dates to Web API?

Passing 2010-01-01 works fine, but when I pass a UTC date such as 2014-12-31T22:00:00.000Z (with a time c

10条回答
  •  天命终不由人
    2020-11-29 02:39

    The problem is twofold:

    1. The . in the route

    By default, IIS treats all URI's with a dot in them as static resource, tries to return it and skip further processing (by Web API) altogether. This is configured in your Web.config in the section system.webServer.handlers: the default handler handles path="*.". You won't find much documentation regarding the strange syntax in this path attribute (regex would have made more sense), but what this apparently means is "anything that doesn't contain a dot" (and any character from point 2 below). Hence the 'Extensionless' in the name ExtensionlessUrlHandler-Integrated-4.0.

    Multiple solutions are possible, in my opinion in the order of 'correctness':

    • Add a new handler specifically for the routes that must allow a dot. Be sure to add it before the default. To do this, make sure you remove the default handler first, and add it back after yours.
    • Change the path="*." attribute to path="*". It will then catch everything. Note that from then on, your web api will no longer interpret incoming calls with dots as static resources! If you are hosting static resources on your web api, this is therefor not advised!
    • Add the following to your Web.config to unconditionally handle all requests: under :

    2. The : in the route

    After you've changed the above, by default, you'd get the following error:

    A potentially dangerous Request.Path value was detected from the client (:).

    You can change the predefined disallowed/invalid characters in your Web.config. Under , add the following: . I've removed the : from the standard list of invalid characters.

    Easier/safer solutions

    Although not an answer to your question, a safer and easier solution would be to change the request so that all this is not required. This can be done in two ways:

    1. Pass the date as a query string parameter, like ?date=2012-12-31T22:00:00.000Z.
    2. Strip the .000 from every request. You'd still need to allow :'s (cfr point 2).

提交回复
热议问题