【问题标题】:C# JSON response does an second JSON requestC# JSON 响应执行第二个 JSON 请求
【发布时间】:2012-10-29 14:11:18
【问题描述】:

我现在使用 JSON 有一段时间了,但这是我无法解决的问题。

该程序是用 C# 编写的,并且有一个名为 CreateWebRequest() 的方法:

public void CreateWebRequest()
    {
        CurrentTime = DateTime.Now;
        target = link;
        request = WebRequest.Create(target) as HttpWebRequest;
        request.ContentType = "application/json; charset=utf-8";
        request.Method = "PUT";
        request.ServicePoint.Expect100Continue = false;
        string postData = jsonString;
        System.Console.WriteLine("POSTDATA: " + postData);
        StreamWriter requestWriter;
        using (requestWriter = new StreamWriter(request.GetRequestStream()))
        {
            requestWriter.Write(postData);
        }

    }

调用另一个获取结果的函数:CreateWebResponse():

public void CreateWebResponse()
    {
        WebResponse response;

        string text;
        try
        {
            response = (HttpWebResponse)request.GetResponse();
        }

        catch (WebException e)
        {
            MessageBox.Show(e.Message);
            return;
        }

        using (var sr = new StreamReader(response.GetResponseStream()))
        {
            text = sr.ReadToEnd();
        }

        APIresult apiresult = JsonConvert.DeserializeObject<APIresult>(text); //Deserialize the text

    }

这些功能都很好,只有一个问题:代码做了两个请求。

当我在 mozilla FireFox 的 RESTClient 中放入相同的 JSON 时,JSON 工作正常。当我只使用 CreateWebRequest() 时它也很好用,但是当我同时使用这两种方法时,代码似乎创建了第二个请求?

是否可以只创建一个响应?将这两个函数合并为一个直接创建响应的函数?

我尝试了其他解决方案并将它们放在一起,它们似乎都不起作用。当我要求响应时,代码不再正常工作并创建两个请求。

有人有解决办法吗?

提前致谢。

我调用的 JSON 函数有几个 if 语句,根据 Firefox 中的 RESTClient 可以正常工作。 下面的代码显示了 RESTClient 调用正确的代码,C# 代码调用了两次:

$sql = 'SELECT...';
        $result = $db->sql_query($sql);//search for member id.
        if($row = $db->sql_fetchrow($result)){//when found, the user has access.
            $member_id = $row['member_id'];
            $sql = 'SELECT ...';
            $result = $db->sql_query($sql);//search for last login today.
            if($row = $db->sql_fetchrow($result)){//if the user has logged in today update the row. 
                $row_check_in_timestamp = $row['check_in_timestamp'];
                $sql = 'UPDATE ...';//update the row with the check out timestamp
                $db->sql_query($sql);
                break;
            }else{//the user hasn't logged in yet today, log in.
                $start_session_array = array(
                    'club_id'   => (int)$club_id,
                    'member_id' => (int)$member_id,
                    'check_in_timestamp' => (int)time(),
                );
                $sql = 'INSERT ...';//check user in and add a new row in the database
                $db->sql_query($sql);
                break;
            }
        }else{
            break;
        }

【问题讨论】:

  • 您如何检测到此代码执行了两个请求?您是在调试服务器并看到两个请求进来,还是在监视 Fiddler(或其他网络监控工具)?另外,您是否有任何未在此代码中显示的身份验证机制(如基本身份验证)?
  • @TylerOhlsen:在 JSON 中是一种方法,它在第一次调用时在数据库中写入新行并找到前一行来更新它。第一次和第二次将时间戳放入数据库并保存差异。当我使用 C# 代码时,它同时执行这两个操作,而它是一个 if 语句(!)。身份验证一切正常,使用 api 密钥,这不是问题。
  • 这可能不是您的问题,但如果您使用基本身份验证,this 可以解释您收到两个请求的原因。 (我知道这个例子使用了 WCF,但是 WebClient 和其他 http 请求类做同样的两步认证)
  • 这些方法是否正确声明为静态?他们有正当理由保持静止吗?
  • @TylerOhlsen:我在 fiddler 运行时尝试了相同的请求,但我只看到一个请求,这是这个问题的奇怪部分。

标签: c# json


【解决方案1】:

已解决:对不起,感谢所有回复,但我已经找到了问题所在。我有一个旧版本作为服务一直在运行,并进行了第二次 JSON 调用。

我通过在服务器端记录调用和阻塞代码找到了它,这些调用在我自己的代码中调用 JSON 来解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多