【问题标题】:Webservice field validation (for external use)?Webservice 字段验证(供外部使用)?
【发布时间】:2019-12-21 03:08:29
【问题描述】:

我们一直在为客户开发 ASP.NET 网络服务。

对于本地测试,本地主机上的 ASP.NET 允许我们直接在 ASP.NET 提供的网页上输入字段值,可见于:

https://www.example.com/webservices/customer/webservice.asmx?op=PlaceOrder

<UserIDNumber>long</UserIDNumber>
<CustomerEmailAddress>string</CustomerEmailAddress>
<CustomerFirstName>string</CustomerFirstName>
<CustomerLastName>string</CustomerLastName>

我们有一些自定义字段验证。例如

  • 如果 CustomerEmailAddress 不是有效的电子邮件地址语法(例如,没有“@”),我们将返回“不是有效的用户电子邮件地址”。

  • 如果 CustomerEmailAddress = "",我们返回“输入 CustomerEmailAddress”。

  • 如果 CustomerFirstName = "" 我们返回“输入用户 CustomerFirstName”。

如果用户在该字段中输入“hello”,ASP.NET 会抛出:

System.ArgumentException: Cannot convert hello to System.Int64.
Parameter name: type ---> System.FormatException: Input string was not in a correct format.
   at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseInt64(String value, NumberStyles options, NumberFormatInfo numfmt)
   at System.String.System.IConvertible.ToInt64(IFormatProvider provider)
   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at System.Web.Services.Protocols.ScalarFormatter.FromString(String value, Type type)
   --- End of inner exception stack trace ---
   at System.Web.Services.Protocols.ScalarFormatter.FromString(String value, Type type)
   at System.Web.Services.Protocols.ValueCollectionParameterReader.Read(NameValueCollection collection)
   at System.Web.Services.Protocols.HtmlFormParameterReader.Read(HttpRequest request)
   at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()
   at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()

我们是否应该指定:

<UserIDNumber>string</UserIDNumber>

虽然在我们给客户的网络服务文档中说它需要一个长数字?

然后在代码中我们可以使用:

Val(strUserIDNumber)>=1 

检查它是否是一个数字。如果不说:

“为 UserIDNumber 输入一个有效的数字。”

【问题讨论】:

  • 你能分享一下验证的代码吗?
  • @ChetanRanpariya 目前类似于“If lngUserID>0 Then Return True Else Return False”。注意 lngUserIDNumber 是 Long。
  • If Long.TryParse(userInput, LongVariable) Then
  • @Mary 是的,我认为谢谢。我真正的问题是,当 web 服务使用者在线看到 asmx 模式(而不是我们的文档)时,当他们看到它是一个字符串而不是一个长时,他们会感到困惑吗?那么这种事情的正常做法是什么?

标签: c# asp.net vb.net asp.net-web-api


【解决方案1】:

为了使您的验证更容易,您可以使用FluentValidation

例子:

public class CustomerValidator : AbstractValidator<Customer> {
  public CustomerValidator() {
    RuleFor(x => x.Surname).NotEmpty();
    RuleFor(x => x.UserIDNumber).NotEmpty().WithMessage("Enter a valid number for UserIDNumber");
    RuleFor(x => x.Discount).NotEqual(0).When(x => x.HasDiscount);
    RuleFor(x => x.Address).Length(20, 250);
    RuleFor(x => x.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
  }

【讨论】:

    【解决方案2】:

    Val(strUserIDNumber)&gt;=1如果传入了不能转换为数字的字符串会抛出错误。

    检查传入的 ID 字符串是否可以转换为数字,然后验证电子邮件。

    例子:

    // validate userID
    long userID = 0;
    if( long.TryParse(strUserIDNumber, out userID) == false)
    {
       return "Not a valid userID";
    }
    
    //validate your email... something like this 
    if (!CustomerEmailAddress.Contains("@"))
       return "Not a valid user email";
    else if(CustomerEmailAddress == "")
       return "Enter a CustomerEmailAddress.";
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2016-04-01
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多