ASMX Web服务:如何从我喜欢从客户端捕获的asmx服务中抛出soap异常

时间:2016-12-30 15:59:35

标签: c# asmx soapexception soap-extension

我想如果客户端发送错误的凭据然后服务抛出肥皂异常,但我尝试但仍然没有运气。

从此处查看我的更新代码https://github.com/karlosRivera/EncryptDecryptASMX

任何人都可以下载我的代码并在他们的PC上运行以捕获问题。

查看此区域

[AuthExtension]
[SoapHeader("CredentialsAuth", Required = true)]
[WebMethod]
public string Add(int x, int y)
{
    string strValue = "";
    if (CredentialsAuth.UserName == "Test" && CredentialsAuth.Password == "Test")
    {
        strValue = (x + y).ToString();
    }
    else
    {
        throw new SoapException("Unauthorized", SoapException.ClientFaultCode);

    }
    return strValue;
}

这一行throw new SoapException("Unauthorized", SoapException.ClientFaultCode);

响应XML正文没有得到我从soapextension进程消息函数中看到的更改。

所以我现在有两个问题

1)我希望服务中的throw SoapException需要更改肥皂响应。

2)从客户端我需要抓住SoapException

请从链接中查看我的最新代码,并告诉我要更改的内容。感谢

2 个答案:

答案 0 :(得分:2)

考虑迁移和使用WCF。这是WCF故障。

您可以使用SoapExtensions.AfterSerializeBeforeSerialze方法替换错误消息或处理错误。

Source

答案 1 :(得分:0)

另一个选择是避免发送SoapException,但是更复杂的对象嵌入了错误语义。 E.g。

[Serializable]
class Result<T>
{
    public bool IsError { get; set; }
    public string ErrorMessage { get; set; }

    public T Value { get; set; }
}

在这种情况下,您的方法可能如下所示:

[AuthExtension]
[SoapHeader("CredentialsAuth", Required = true)]
[WebMethod]
public Result<string> Add(int x, int y)
{
    string strValue = "";
    if (CredentialsAuth.UserName == "Test" && CredentialsAuth.Password == "Test")
    {
        return new Result<string> { Value = (x + y).ToString() };
    }
    else
    {
        return new Result<string> { IsError = true, ErrorMessage = $"Unauthorized -  {SoapException.ClientFaultCode}" };
    }
}
可以开发

Result以包含一个字段/输入错误数组,以返回与错误输入参数值相关的更精确的错误消息。