繁体   English   中英

从 web url 获取数据时如何处理 System.InvalidCastException。(在 C# WinForm 中)

[英]How to handle System.InvalidCastException while fetching data from a web url. (in C# WinForm)

  1. 我制作了一个程序,其中我从 url 获取付款状态,然后使用 json 解析响应。

  2. 在 WinForm 应用程序中,我通过单击从 url 接收数据来获得付款按钮,但如果传递的令牌或数据错误,则我的应用程序无法处理异常,并且不会在控制台上打印自定义错误,它仅提供 System.InvalidCastException。

  3. 这是我的 C# 程序

namespace WinFormsApp1
{
    public static class RestHelper
    {
        static string tokenKey = System.IO.File.ReadAllText(
            @"C:\Users\Asus\source\repos\WinFormsApp1\Tokken.txt"
        );

        static string userId = System.IO.File.ReadAllText(
            @"C:\Users\Asus\source\repos\WinFormsApp1\UserId.txt"
        );

        private static readonly string baseURL =
            "https://paymentddn.gov.in:8085/getChallanByNo/" + tokenKey + "/";

        private static readonly string baseURL3 = "/" + userId;

        private static readonly string baseURL1 = "https://paymentddn.gov.in:8085/dverify/";

        public static async Task<string> GetAll(string challanNo)
        {
            try
            {
                using (HttpClient client = new HttpClient())
                {
                    using (
                        HttpResponseMessage res = await client.GetAsync(
                            baseURL + challanNo + baseURL3
                        )
                    )
                    {
                        using (HttpContent content = res.Content)
                        {
                            string data = await content.ReadAsStringAsync();
                            if (data != null)
                            {
                                return data;
                            }
                        }
                    }
                }
            }
            catch (System.Exception e)
            {
                Console.WriteLine(" Server Error " + e.Message);
            }

            return string.Empty;
        }

        public static string BeautifyJson(string jsonStr)
        {
            // JToken parseJson = JToken.Parse(jsonStr);
            //return parseJson.ToString(Formatting.Indented);
            string[] m = jsonStr.Split("|");
            StringBuilder sb = new StringBuilder();
            sb.Append("Payment Status = " + m[2]);
            sb.Append("\n");
            sb.Append("Challan No = " + m[5]);
            sb.Append("\n");
            sb.Append("Invoice = " + m[6]);
            sb.Append("\n");
            sb.Append("Amount = " + m[7]);
            sb.Append("\n");
            sb.Append("Status = " + m[8]);
            sb.Append("\n");
            sb.Append("Payment Mode = " + m[12]);
            return sb.ToString();
        }

        public static async Task<string> Get(string rcpNo)
        {
            using (HttpClient client = new HttpClient())
            {
                using (HttpResponseMessage res = await client.GetAsync(baseURL1 + rcpNo))
                {
                    using (HttpContent content = res.Content)
                    {
                        string data = await content.ReadAsStringAsync();
                        if (data != null)
                        {
                            return data;
                        }
                    }
                }
            }

            return string.Empty;
        }
    }
}
  1. 上面的 Class 被命名为 RestHelper,我在其中获取数据并对响应进行解析

    namespace WinFormsApp1 { public partial class Form1: Form { public Form1() { InitializeComponent(); }

     private async void btnGetAll_Click(object sender, EventArgs e) { try { var responce = await RestHelper.GetAll(txtChallan.Text); JObject mRespose = JObject.Parse(responce.ToString()); JObject mParent = (JObject)mRespose["myObjectList"]; JObject mPaymentModel = (JObject)mParent["paymentInfoModel"]; string rcpNo = (string)mPaymentModel["receiptNo"]; Console.WriteLine("Response pay == " + rcpNo); var responce1 = await RestHelper.Get(rcpNo); txtResponce.Text = RestHelper.BeautifyJson(responce1.ToString()); // txtResponce.Text = RestHelper.BeautifyJson(responce); }catch(System.Exception d) { Console.WriteLine("Server Error"+ d.Message); } } private void label1_Click(object sender, EventArgs e) { } private void label2_Click(object sender, EventArgs e) { } private void label3_Click(object sender, EventArgs e) { } } }
  2. 这是 Form1.cs class,我在其中从 RestHelper 调用 GetAll 和 Get 方法。

  3. 我使用了 try catch 块并尝试将我的Task<string>更改为Task<Object>但仍然遇到相同的异常。

“WinFormsApp1.exe”(CoreCLR:clrhost):已加载“C:\Program Files\do.net\shared\Microsoft.NETCore.App\3.1.17\System.Runtime.Numerics.dll”。

 Exception thrown: 'System.InvalidCastException' in WinFormsApp1.dll Exception thrown: 'System.InvalidCastException' in WinFormsApp1.dll 'WinFormsApp1.exe' (CoreCLR: clrhost): Loaded 'C:\Program Files\do.net\shared\Microsoft.NETCore.App\3.1.17\System.Text.Encoding.CodePages.dll'. The program '[29328] WinFormsApp1.exe' has exited with code 0 (0x0).

这个解决方案非常简单,而不是使用Console.Writeline使用MessageBox.Show((string)mRespose["message"], "Server Error", MessageBoxButtons.OK, MessageBoxIcon.Error); .

在 Form1.cs class 中将 MessageBox 放在 catch 部分并在其中使用自定义消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM