【问题标题】:Using AJAX with Random.org in MVC 4在 MVC 4 中将 AJAX 与 Random.org 一起使用
【发布时间】:2014-05-21 16:48:25
【问题描述】:

我无法从 Random.org 获取号码。我正在关注他们的 API,并且我相信我已经正确构建了请求。这是请求代码:

self.GetResults = function () {
            $.ajax({
                url: 'https://api.random.org/json-rpc/1/invoke',
                dataType: "json",
                contentType: "application/json-rpc; charset=utf-8",
                type: 'POST',
                data: {
                    "jsonrpc": "2.0",
                    "method": "generateIntegers",
                    "params": {
                        "apiKey": "Get-a-free-one-at-the-site",
                        "n": 1,
                        "min": 1,
                        "max": 20
                    },
                    "id": 1
                }

            })
            .done(function (data, status, request)
            {
                alert("Success! " + data[0]);
            })
            .fail(function (request, status, error)
            {
                alert("Failed " + error);
            });
        }

我遇到的问题如下:

  1. 如果我不包含contentType: "application/json; charset=utf-8",则默认类型为"application/x-www-form-urlencoded; charset=UTF-8",根据jQuery API 文档。 Random.org 在他们的 API 中声明他们需要 JSON 请求(特别是 application/json-rpc,但 application/json 是可以接受的)。因此,我得到一个解析错误作为响应。
  2. 如果我确实包含了上述内容类型,则会收到错误消息“Access-Control-Allow-Headers 不允许请求标头字段 Content-Type。”

我已尝试将代码添加到 web.config 以允许请求标头如下:

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
  </customHeaders>
</httpProtocol>

来自这个帖子https://stackoverflow.com/a/12413863/981202,但运气不好。

我也尝试过如下修改 Global.asax:

protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
{
    HttpContext.Current.Response.Headers.Remove("Access-Control-Allow-Headers");
}

就像在另一个 Stack Overflow 帖子中一样(我没有链接),但这似乎也没有做到。为了清楚起见,我把这个函数放在 Application_Start() 函数之后。

您可能想知道为什么我不只使用 Random 类。原因是因为我想使用 Random.org,如果没有别的,那么作为练习。如果存在,我想找到解决此问题的方法。之前我这里有一些数据表明C#的Random类做的不是很好,但是我更正了,所以数据已经被删除了。是的,Random 类是一个选项,但正如我所提到的,我想找到解决这个问题的方法。

【问题讨论】:

  • 你能链接到你在 random.org 上阅读的文档吗?我正在查看random.org/clients/http,根据我在那里看到的内容,您需要做的就是请求以下网址:random.org/integers/…。此外,即使 System.Random 并不是真正的随机,但似乎在数以万计的试验中,您会看到比这更好的分布。
  • 你能展示你在哪里实现了 C# 随机类吗?使用相同的数据,运行我自己的测试生成的直线比你的要直线得多。
  • @pmcoltrane:我正在阅读的 Random.org 文档在这里:api.random.org/json-rpc/1 具体在这里:api.random.org/json-rpc/1/introduction 和这里(在 generateIntegers 下:api.random.org/json-rpc/1/basic
  • @Jonesy:我会尽我所能向你展示。 Counter 类只是一个 switch 语句,每次生成一个数字时都会将其递增 1。 if (response == 'y') { while (DateTime.Now
  • 您应该在循环之外实例化 Random 一次。 Random rand = new Random(); 使用系统计时器作为其种子值创建一个新的 Random 实例。通过在循环内调用它,您可能会重复使用相同的计时器值对其进行播种。请参阅msdn.microsoft.com/en-us/library/h343ddh9.aspx 的备注。 (我将不得不查看您链接的 json-rpc 文档。)

标签: c# jquery ajax json random


【解决方案1】:
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
  </customHeaders>
</httpProtocol>

我已将此代码添加到我的 web.config 中。起初我把它放在&lt;configuration&gt; 节点中,但它不起作用。然后我意识到它应该在&lt;system.webServer&gt; 内,它也在&lt;configuration&gt; 节点内。一旦我把它放在那里,它就起作用了,我没有再次收到提到的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    相关资源
    最近更新 更多