接收空参数时在 Web 服务上捕获参数异常

本文关键字:参数 异常 服务 Web | 更新日期: 2023-09-27 18:33:02

好的,所以昨天我发布了我正在开发的一些系统遇到的一些问题。我现在在这里遇到的问题,我正在经历最坏的情况,并认为用户以某种方式尝试调用我的 Web 服务并忘记输入参数,因此 Web 服务收到空参数......我尝试用If进行验证,但它仍然给我抛出了一个ArgumentException错误,所以我离开了if验证,而是将整个代码放在一个try-catch中,问题是这个"catch 没有进入那个代码块,它只是不断在纯网络文本上抛出ArgumentException......

这是我的代码:

[WebMethod(Description = "Private Title", EnableSession = false)]
public string[] M102(int p_enclosure, string p_transaction, int p_operation, int p_commodity,
                          string p_bl, string p_inDate, string p_blhouse, string p_anexo29, int p_tranType,
                          string p_vessel, string p_trip, int p_entry, string p_padlock, string p_brands, 
                          string p_appoint, string p_plates, string p_qmark)
{
    string eDate;
    try
    {/*/WebService Code/*/}
    catch (ArgumentException Ex)
    {
        string message;
        string[] error = 
            { 
                "000",
                "DataCaptureError.- " + Ex.Message,
                "Date"
            };
        SqlConnection con8 = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["CTSSQL"].ConnectionString);
        SqlCommand cmd8 = new SqlCommand();
        cmd8.Connection = con8;
        cmd8.CommandText = "dbo.sp_errorlog";
        cmd8.CommandType = CommandType.StoredProcedure;
        cmd8.Parameters.Add("@p_inTrans", SqlDbType.NChar, 12).Value = "0";
        cmd8.Parameters.Add("@p_enclosure", SqlDbType.NChar, 6).Value = "0";
        cmd8.Parameters.Add("@p_trans", SqlDbType.NChar, 18).Value = "0";
        cmd8.Parameters.Add("@p_method", SqlDbType.NChar, 6).Value = "102";
        cmd8.Parameters.Add("@p_message", SqlDbType.NVarChar, 250).Value = error[1];
        cmd8.Parameters.Add("@vo_message", SqlDbType.VarChar, 250).Direction = ParameterDirection.Output;
        cmd8.Parameters.Add("@vo_errorDate", SqlDbType.DateTime).Direction = ParameterDirection.Output;
        con8.Open();
        cmd8.ExecuteNonQuery();
        con8.Close();
        cmd8.Connection.Close();
        message = "" + cmd8.Parameters["@vo_message"].Value;
        eDate = "" + cmd8.Parameters["@vo_errorDate"].Value;
        eDate = Convert.ToDateTime(eDate).ToString("dd/MM/yyyy HH:mm:ss");
        error[2] = eDate;
        return error;
    }
}

我想做的是获取该错误消息并将其放入我的数据库中......问题是它永远不会输入 CATCH 代码,它会直接吐出错误。

希望有人能帮助我找到一种方法来捕获或验证此 NULL 参数问题并将其粘贴到数据库中

无论如何,谢谢大家。

接收空参数时在 Web 服务上捕获参数异常

如果要

允许用户传递 null,则必须使int参数为空。将签名更改为使用 int? 而不是 int

public string[] M102(int? p_enclosure, string p_transaction, int? p_operation, int? p_commodity,
                      string p_bl, string p_inDate, string p_blhouse, string p_anexo29, int p_tranType,
                      string p_vessel, string p_trip, int? p_entry, string p_padlock, string p_brands, 
                      string p_appoint, string p_plates, string p_qmark)

字符串(和其他引用类型)很好,但任何值类型参数都无法接收 null 参数,这很可能是发生异常的地方。

然后,在处理方法主体中的可为 null 的参数时,必须使用 HasValue 属性测试参数是否具有值,并获取实际值,必须使用 Value 属性。

在方法主体中,您必须手动测试每个参数的null,如果任何不应该为空(即整数),则返回错误结果并将其记录在系统中。

// you'd want to add this check early in the method body
if(!p_enclosure.HasValue || p_transaction == null || !p_operation.HasValue ...
{
    try{
       // log the error
    }catch{
       // ignore errors from the logging system
    }
    //   and stop processing
    return null; // or whatever makes sense in case of invalid arguments
}