【问题标题】:No response while calling API in ASP.NET C# Web Forms在 ASP.NET C# Web 窗体中调用 API 时没有响应
【发布时间】:2015-10-28 08:48:17
【问题描述】:

我一直在搜索这个论坛和其他论坛来解决一个看似简单的问题。目标是调用 2 个 API 并对收到的数据进行一些计算。但是,当我从下面的代码调用任何 API 时,对 PostAsJsonAsync 调用没有响应。调试显示该命令已执行,但此调用之后的代码从未执行。我确实在 Chrome 开发者工具中收到以下消息。

'iisexpress.exe' (CLR v4.0.30319: /LM/W3SVC/2/ROOT-2-130904674774978518):已加载 'C:\Users\ADMIN\AppData\Local\Temp\Temporary ASP.NET 文件\vs\6d7d5266\5b17a55b\App_Web_vu1twtot.dll'。找不到或无法打开 PDB 文件。 'iisexpress.exe' (CLR v4.0.30319: /LM/W3SVC/2/ROOT-2-130904674774978518):已加载 'C:\Users\ADMIN\AppData\Local\Temp\Temporary ASP.NET 文件\vs\6d7d5266\5b17a55b\App_Web_h35301am.dll'。

线程 0x3b1c 以代码 0 (0x0) 退出。 线程 0x34a4 已退出,代码为 0 (0x0)。

所使用的 API 是来自 http://jsonplaceholder.typicode.com/ 的简单假 API。 如果我在 JS 中使用 Ajax,这个 API 和我测试过的其他 API 响应良好。请帮帮我。

以下代码取自http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client 的 ASP.NET 教程

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

public class Product
{
    public double userid { get; set; }
    public double id { get; set; }
    public string title { get; set; }
    public string body { get; set; }
}

public partial class _Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        RunAsync().Wait();
    }

    static async Task RunAsync()
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://jsonplaceholder.typicode.com");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            // HTTP POST
            var gizmo = new Product() { userid = 11, id = 100, title = "Widget11", body = "Widget11" };
            HttpResponseMessage response = await client.PostAsJsonAsync("/posts/1", gizmo);
            if (response.IsSuccessStatusCode)
            {

            }

        }
    }

}

【问题讨论】:

  • 根据REST API,调用时不需要添加请求头。您可以尝试删除代码行吗:client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
  • 试过了,但没用。 Aizad Ahmed 下面的解决方案奏效了。

标签: c# asp.net json api


【解决方案1】:

Check this

由于异步方法太多,我遇到了类似的问题。

【讨论】:

  • 非常感谢。通过在 PostasJsonAsync 命令中添加 .ConfigureAwait(false) 解决了该问题。
【解决方案2】:

我不太喜欢 Web 表单,但我在 WPF 应用程序中尝试过!

在 MainWindow.xaml 中使用以下按钮:

<Grid>
    <Button Name='api_btn' Click="api_btn_Click">Call Api</Button>
</Grid>

在 MainWindow.xaml.cs 中粘贴以下代码:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace ApiTest
{
    public class Description
    {
        public int id { get; set; }
        public int userId { get; set; }
        public string title { get; set; }
        public string body { get; set; }
    }

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void api_btn_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                using (var client = new HttpClient())
                {
                    client.BaseAddress = new Uri("https://jsonplaceholder.typicode.com");
                    client.DefaultRequestHeaders.Accept.Clear();
                    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                    //HttpsPostRequest(URL);
                    ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

                    Description desc = null;
                    var response = await client.GetAsync("posts/1").ConfigureAwait(false);
                    if (response.IsSuccessStatusCode)
                    {
                        desc = await response.Content.ReadAsAsync<Description>();
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Exception caught.", ex);
                //throw;
            }
        }
    }
}

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,我解决了这个问题。 注意这个问题,您有一个名为“RunAsync”的异步方法。 在此方法中,您将 PostAsJsonAsync 称为 Async。

    如果您使用嵌套异步方法,您的结果中可能会出现“死锁”。 为了防止这个问题,在第二个、第三个和多个异步方法结束时使用“ConfigureAwait(false)” 例如:

    public static async Task RunAsync()
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://jsonplaceholder.typicode.com");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
            // HTTP POST
            var gizmo = new Product() { userid = 11, id = 100, title = "Widget11", body = "Widget11" };
            HttpResponseMessage response = await client.PostAsJsonAsync("/posts/1", gizmo).ConfigureAwait(false);
            if (response.IsSuccessStatusCode)
            {
    
            }
    
        }
    

    【讨论】:

      【解决方案4】:

      这可以正常工作。

      HttpResponseMessage 响应 = 等待 client.PostAsJsonAsync("/posts/1", gizmo).ConfigureAwait(false);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-23
        • 2014-04-22
        • 1970-01-01
        • 1970-01-01
        • 2019-05-17
        相关资源
        最近更新 更多