C# 无法通过 HttpResponseMessage 获取 HTTP 返回代码

Posted

技术标签:

【中文标题】C# 无法通过 HttpResponseMessage 获取 HTTP 返回代码【英文标题】:C# Unable to Get HTTP Return Codes via HttpResponseMessage 【发布时间】:2020-12-29 10:57:17 【问题描述】:

我在 VS 中尝试检查通过 API 构建和发布数据的方法的返回代码时出错。 产生错误的行是:

if (BuildApi(MyGlobals.data5, MyGlobals.data1, FQAN, MyGlobals.data4) == MyGlobals.ReturnCode)

错误是: 运算符“==”不能应用于“任务和“字符串”类型的操作数 我的目标是将这些参数(data1、data5 等)传递给 BuildApi() 方法,然后通过 API 调用发布该数据。 成功发布数据后,如果发生错误,我应该得到返回码 200 或返回码 400(根据 API 开发人员的说法)。 BuildApi() 方法应将 200 或 400 返回到条件语句。 BuildApi() 方法的格式是否正确以返回返回码,如果是,那么“if”语句有什么问题?

提前感谢您的帮助!

完整代码:

static class MyGlobals

    public static XmlDocument XmlAccounts = new XmlDocument();
    public static XmlNode XmlRoot;
    public static string data1  get; set; 
    public static string data2  get; set; 
    public static string data3  get; set; 
    public static string data4  get; set; 
    public static string data5  get; set; 
    public static string ReturnCode  get; set; 



static HttpClient client = new HttpClient();
static void Main(string[] args)

    SqlConnection ObjConn = new SqlConnection();
    string ConnectMe = @"

            Data Source             =SERVER;
            Database                =DATABASE1;
            User ID                 =USER;
            Pwd                     =PASS;
            Connection Timeout      =700

        ";



    // Open Connection
    ObjConn = new SqlConnection(ConnectMe);
    ObjConn.Open();

    // Call methods based on the required tool
    SR_Provisioning(ObjConn);
    


static public void SR_Provisioning(SqlConnection ObjConn)

    Get = @"

        SELECT
            data1,
            data2,
            data3,
            data4,
            data5

        FROM
            table
    ";



    ObjAdp = new SqlDataAdapter(Get, ObjConn);
    ObjAdp.Fill(OutputTable); 

    foreach (DataRow OutputRow in OutputTable.Rows)

    

        //Initalize FQAN

        string FQAN = "";



        // Convert query output to variables

        MyGlobals.data1 = OutputRow[0].ToString();
        MyGlobals.data2 = OutputRow[1].ToString();
        MyGlobals.data3 = OutputRow[2].ToString();
        MyGlobals.data4 = OutputRow[3].ToString();
        MyGlobals.data5 = OutputRow[4].ToString();

        // Instantiate new objects

        strFunctions MyStr = new strFunctions();
        wshWin32API win32api = new wshWin32API();

        // Convert server to FQDN for accessibility ease
        string FQDN = getFQDN(MyGlobals.data1, ObjConn);

        // Perform action based on Tranaction_Type
        switch (MyGlobals.data5)

        
            case "Add":
                if (MyGlobals.data2 == "LOCAL")
                
                    // Create local ID first
                    try
                    
                        FQAN = MyGlobals.data1 + "\\" + MyGlobals.data3;
                        // Check the return code to determine how to log the results

                        if (BuildApi(MyGlobals.data5, MyGlobals.data1, FQAN, MyGlobals.data4) == MyGlobals.ReturnCode)

                        
                            switch (MyGlobals.ReturnCode)
                            /*
                                Return Codes
                                200 (Created)
                                400(Expectation Failed)
                            */

                            
                                case "200":
                                    // Do something
                                    AllIsGood();
                                    break;

                                case "400":
                                    // Do something else
                                    AllIsBad();
                                    break;
                            
                        
                    
                    catch (Exception err)
                    
                        // Handle error and update transaction record
                        Update_Row();
                    
                



static async Task<string> BuildApi(string data5, string data1, string FQAN, string data4)


    try
    
        UriBuilder baseUri = new UriBuilder("https://pwmfunction001.azurewebsites.net/api/VMGroupMemberModify01?code=T753ljF4jwXZXzmotCnnrBdV7Mrbqvcd3ibazRb92ZoBfJADuCpq5w==-Headers@Metadata=true-Body@");

        // Create the query string
        string queryToAppend = "DATA5=" + data5 + ";DATA1=" + data1 + ";FQAN=" + FQAN + ";data4=" + data4 + "";

        if (baseUri.Query != null && baseUri.Query.Length > 1)
        
            baseUri.Query = baseUri.Query.Substring(1) + ";" + queryToAppend;
        
        else
        
            // Check this
            baseUri.Query = queryToAppend;
        

        string httpResponseBody = "";
        
        var client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        
        var content = new StringContent(client.ToString());
        HttpResponseMessage response = await client.PostAsync(baseUri.ToString(), content);

        if (response.IsSuccessStatusCode)
        
            httpResponseBody = "200";
            return httpResponseBody;
        
        else
        
            httpResponseBody = "400";
            return httpResponseBody;
        
    
    catch(HttpRequestException err)
    
        throw err;
      





【问题讨论】:

【参考方案1】:

您的 BuildApi 函数是异步的,因此您需要在代码中等待它:

if (await BuildApi(MyGlobals.data5, MyGlobals.data1, FQAN, MyGlobals.data4) == MyGlobals.ReturnCode)

更新:

如果你不能异步运行它,那么你需要结果:

if (BuildApi(MyGlobals.data5, MyGlobals.data1, FQAN, MyGlobals.data4).Result == MyGlobals.ReturnCode)

但是,我会首先尝试使您的调用方法异步

【讨论】:

但是调用BuildApi的方法不是异步的,所以不能按原样工作。 谢谢大家@GlynnHurrell 和@EtennedeMartel!更新后的解决方案清除了 VS 中的错误。一旦 API 准备就绪,我将进行测试。一个问题 - BuildApi() 方法对您来说是否可靠?这是我第一次发布到 API。 显然这取决于您是否对 API 有任何控制权,但不是真的。您正在尝试发布到 API,但您正在通过查询字符串传递数据!虽然它会起作用,但你绝对应该避免它!相反,您应该在请求正文中传递数据 - 使用 new StringContent(...) 已经完成了一半,您只想对数据进行建模,然后将其转换为 JSON 字符串。

以上是关于C# 无法通过 HttpResponseMessage 获取 HTTP 返回代码的主要内容,如果未能解决你的问题,请参考以下文章

C# 无法通过 HttpResponseMessage 获取 HTTP 返回代码

无法通过 C# oledb 将记录插入 MS Access

无法从 C# 通过 Wallet 连接到 Oracle DB

C# 无法通过换行符将字符串拆分为数组(来自 StreamReader)

无法通过 C# 中的 OleDB 从 Microsoft Access 中删除表的所有行

C#窗体 webBrowser控件赋值后无法编辑~~~~~