簡體   English   中英

如何解決ASMX的輸入驗證

[英]How can I get around ASMX's input validation

我正在使用C#asmx創建Web服務。 我想在每個Web方法中執行自己的輸入驗證。 在編寫代碼時,我意識到asmx本身會在輸入到達Web方法之前驗證輸入,因此使我自己無法執行驗證。 讓我告訴你我的意思。

說我有一個這樣的網絡方法:

[WebMethod]
public string method(int param1)
    {
       Validate(param1)
    }

如果調用method的人傳遞 for param1 ,那么asmx本身將引發異常,然后我才能進行自己的驗證。 (因為a不是int類型,所以拋出異常。)

現在,我可以將param1為字符串,然后根據asmx的驗證,用戶放入param1任何內容都將是有效的。 但這是不可取的,因為我不會在這里討論。

有沒有一種方法可以在不使所有類型為string的參數的情況下實現我要實現的目標? 如果沒有,那不是世界的盡頭,因為我可以使之工作,但我想知道是否有辦法。

PS,我知道asmx已過時,但是我的公司告訴我使用它。

編輯:我會說一件事,以幫助您解決我的問題。 我希望我的Web服務在所有情況下都返回具有特定結構的json字符串,即使輸入無效。 如果輸入無效,則應返回一個json字符串說明問題。 但在輸入無效的情況下,我無法執行此操作,因為asmx在請求到達我的Web方法之前引發了異常。

我了解為什么asmx是舊版。 它不能讓您控制輸入驗證的事實是荒謬的。

我想到了。

您需要創建一個類,該類根據字符串定義輸入。 然后,使此類成為Web方法的輸入參數的類型。 ASMX將反序列化輸入到類的實例中。 這樣做有很多好處,原因如下:

  • (1)由於該類僅包含字符串,因此ASMX不會引發任何異常
  • (2)您可以從類中完全控制輸入參數的名稱。 這是DRY原理的一大優點。

在這里定義我的輸入:

    public abstract class Input
    {

    }

    public class CreatePendingOrderInput : Input
    {
        public string customerNo;
        public string callingCountry;
    }
}

現在,只需將其與網絡方法聯系起來即可:

  [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string CreatePendingOrder(CreatePendingOrderInput input)
        {
            return  JsonConvert.SerializeObject((IVRProcesses.Process<CreatePendingOrderOutput>(IVRProcesses.CreatePendingOrder, input)));
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM