小编Des*_*xAZ的帖子

用于 PCI 合规性的敏感数据的自定义 JSON 序列化

我们必须记录 Web 服务的传入请求和传出响应。这包括每个对象的 JSON 序列化,以便它们可以存储在数据库中。

某些信息被视为敏感信息(例如社会安全号码、信用卡号码等),我们不能根据 PCI 合规性将这些信息包含在我们的日志中。现在我们正在用占位符值(例如“[PRIVATE]”)手动替换这些值,但这仅适用于字符串属性。某些数据(例如出生日期)未存储为字符串,因此这不起作用,因为在序列化之前替换属性值。最大的问题是有人很容易忘记在记录之前删除敏感数据,这是非常不可取的。

为了解决这个问题,我想创建一个自定义属性并将其放置在属性上,然后让 JSON 序列化例程在每个属性上查找此属性,如果存在,请将序列化值替换为占位符,例如“[PRIVATE] ”。

现在我们使用 System.Web.Script.Serialization.JavaScriptSerializer 进行序列化。显然它对我的自定义属性一无所知。我将如何更改序列化过程,以便用我的自定义“SensitiveData”属性修饰的任何数据都替换为占位符值?我不反对使用不同的序列化程序,但希望我可以利用现有序列化程序的功能,而不是编写自己的序列化程序。

c# serialization json pci-compliance

4
推荐指数
1
解决办法
1419
查看次数

实体框架将"1"附加到表名称并且查询失败

我们有一个使用Web Api和Entity Framework的电子商务网站.我最近为一个名为"BundleProduct"的实体创建了一个ApiController.当我在控制器上调用GET方法时,我得到一个System.Data.SqlClient.SqlException:"无效的对象名称'dbo.BundleProducts1'."

使用VS调试器,这是正在执行的查询(此表中只有两列,一起形成主键):

SELECT 
[Extent1].[Fk_BundleID] AS [Fk_BundleID], 
[Extent1].[Fk_ProductID] AS [Fk_ProductID]
FROM [dbo].[BundleProducts1] AS [Extent1]
Run Code Online (Sandbox Code Playgroud)

没有"BundleProducts1"表,它应该被称为"BundleProducts".我在代码中进行了搜索,但找不到使用名称"BundleProducts1"的任何实例.

BundleProducts表表示"Bundles"表和"Products"表之间的多对多关系.此特定表只有两列,两者都是主键.我确实看过DbContext类,它对BundleProducts的唯一引用是:

public DbSet<BundleProduct> BundleProducts { get; set; }

modelBuilder.Entity<Bundle>()
.HasMany(e => e.Products)
.WithMany(e => e.Bundles)
.Map(m => m.ToTable("BundleProducts")
.MapLeftKey("Fk_BundleID")
.MapRightKey("Fk_ProductID"));
Run Code Online (Sandbox Code Playgroud)

为什么EF在表名后附加"1",我该怎么做才能改变它?

entity-framework asp.net-web-api2

3
推荐指数
1
解决办法
521
查看次数

正确使用EnsureSuccessStatusCode和IsSuccessStatusCode

我正在调用我的Web API HttpClient,我看到有一个EnsureSuccessStatusCode方法和一个IsSuccessStatusCode属性.哪一个合适?

我读了这篇文章,还有一些问题:

使用EnsureSuccessStatusCode并处理它抛出的HttpRequestException

我遇到的问题是,如果我发送一个GET请求,我传递了ID我想要检索的对象,基本上有两个结果:

  1. 我以状态200返回对象
  2. 我可以返回null,因为没有匹配,但是这会导致状态为404.

如果我调用EnsureSuccessStatusCode()状态404将导致抛出异常.这并不理想,因为当我测试我的代码时,我一直收到404错误,这首先让我觉得API URL不正确,但实际上没有匹配的对象与提供的Id.在这种情况下,我宁愿返回一个null对象而不是抛出异常.

所以我尝试检查IsSuccessfulStatusCode属性的值.这似乎是一个更好的选择,当此属性为false时,我可以返回一个null对象,但是,有许多状态代码可能导致此属性具有false值.404是其中之一,但还有其他几个状态代码,例如400 Bad Request,405 Method Not Allowed等.我想记录除404之外的所有不成功的错误代码的异常,我想知道是否有一种更好的方法可以做到这一点,而不是检查ResponseCode响应的值,然后抛出一个由我的catch块捕获的异常,这是记录发生的地方.

这是我的GET方法的代码:

public static Customer GetCustomerByID(int id)
{
    try
        {
            using (var client = GetConfiguredClient())
            {
                Customer customer = null;
                var requestUri = $"Customers/{id}";

                using (var response = client.GetAsync(requestUri).Result)
                {
                    if (response.IsSuccessStatusCode)
                        customer = response.Content.ReadAsAsync<Customer>().Result;
                }

                return customer;
            }
        }
        catch (Exception ex)
        {
          ex.Data.Add(nameof(id), id);

          LogException(ex);

          throw; …
Run Code Online (Sandbox Code Playgroud)

c# exception-handling httpresponse asp.net-web-api

3
推荐指数
2
解决办法
1万
查看次数

创建抽象泛型方法

我有一个C#类,其方法如下:

public class MyType
{
    public MyType Clone()
    {
        var clone = (MyType)MemberwiseClone();

        // Do some other stuff here with the clone's properties

        return clone;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一堆其他类,我想实现Clone方法所以我想我可以创建一个抽象基类,我可以在其中一般定义Clone方法,所以我不必在每个类中放置具体的实现.

我认为这是可能的,但是我没有对泛型做太多工作,而且我过去(几个月前,因为沮丧而丢弃我的代码)的尝试也没有成功.

这可能吗?如果是这样,怎么办呢?

c# generics inheritance abstract-class

0
推荐指数
1
解决办法
182
查看次数