不允许在服务请求中使用unicode字符

时间:2016-01-22 09:10:13

标签: c# web-services rest asp.net-web-api unicode

我有一个不允许nvarchar即unicode字符的SQL数据库。 有没有办法让我在休息服务(使用web api构建)上设置编码,以便在请求包含非ascii unicode字符时失败?

1 个答案:

答案 0 :(得分:0)

您可以使用.NET的内置编码器来实现字符集验证。

Encoding课程可让您访问所有编码。

每个Encoding个实例允许使用方法stringbyte[]GetBytes(string)转换为GetString(byte[]),反之亦然。

GetBytes方法用'?'替换不可转换的字符问号。您可以更改此行为以获取异常。

以下代码检查非ISO-8859-1字符并在无效字符上引发异常。

[TestMethod]
public void VerifyEncoding_UTF8CharsGiven()
{
    var value = "hello ☃❆⛇✺⑳⑯✵ȳה";
    var encoding = Encoding.GetEncoding("iso-8859-1", EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback);
    try
    {
        var bytes = encoding.GetBytes(value);
        Assert.Fail("EncoderFallbackException should have occured");
    }
    catch (EncoderFallbackException ex)
    {
        // Unable to translate Unicode character \u1F384 at index 6 to specified code page.
        Debug.WriteLine(ex.Message);
    }
}

这个显示成功的编码匹配,因为没有异常发生。

[TestMethod]
public void VerifyEncoding_CorrectCharsGiven()
{
    var value = "hello my friends";
    var encoding = Encoding.GetEncoding("iso-8859-1", EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback);
    var bytes = encoding.GetBytes(value); // no exception
}

您可以使用此代码创建验证属性,或按您希望的方式进行验证。您可能希望创建自己的DecoderFallback,它不会抛出异常,并出于性能原因调用回调。