小编Nit*_*amk的帖子

级联删除与实体框架 - 由EF删除的相关实体

我在实体框架中删除了一个问题.简而言之,EF显式尝试从数据库中删除实体,即使我已经明确地将EF配置为在数据库中使用级联删除.

我的设计:

我有三种实体类型MainEntity,EntityTypeAEntityTypeB.EF已经配置在删除时使用级联删除EntityTypeAEntityTypeB.换句话说,如果我删除了一个实例MainEntity,我希望删除所有相关EntityTypeAEntityTypeB实例.我从不删除EntityTypeAEntityTypeB不删除他们的父母.

我的问题是EF明确地发出了一个DELETE声明EntityTypeA,导致我的应用程序崩溃.

这就是我的模型:

这些关系具有以下非默认配置:

  • MainEntity -> EntityTypeA OnDelete: Cascade
  • MainEntity -> EntityTypeB OnDelete: Cascade

这种关系EntityTypeA -> EntityTypeBOnDelete: None

数据库内容

INSERT INTO MainEntities (Name) values ('Test')
insert into EntityTypeA (MainEntityID) VALUES (1)
insert into EntityTypeB (MainEntityID, EntityTypeAId) VALUES (1, 1)
insert into EntityTypeB (MainEntityID, EntityTypeAId) VALUES (1, 1)
Run Code Online (Sandbox Code Playgroud)

我的代码:

class Program
{ …
Run Code Online (Sandbox Code Playgroud)

entity-framework cascading-deletes

29
推荐指数
2
解决办法
4万
查看次数

为什么WCF抱怨身份检查失败?

我正在创建一个WCF应用程序,我将使用证书来加密客户端和服务器之间的通信.在我的开发环境中,我想使用我使用makecert创建的测试证书/自签名证书.(只有服务器才有证书,客户端不会).

我已将证书安装到证书库中,一切正常.在客户端上,certificateValidationMode当前设置为"false",因为我正在使用测试证书.

我的问题:

在客户端的app.config中,我需要指定identity元素:

<endpoint ... >
   <identity>
      <dns value="<Name-Of-Server-Computer>"/>
   </identity>
</endpoint>
Run Code Online (Sandbox Code Playgroud)

如果我删除标识元素,当我尝试连接到服务器时,我在客户端中收到以下错误消息:

传出消息的身份检查失败.远程端点的预期DNS标识是"localhost",但远程端点提供DNS声明"服务器名称 - 计算机".如果这是合法的远程端点,则可以通过在创建通道代理时明确指定DNS标识"Name-Of-Server-Computer"作为EndpointAddress的Identity属性来解决问题.

所以这是我的问题:

  • 是否仅在使用测试/自签名证书时才进行身份检查?当我使用从CA购买的真实可信证书部署我的应用程序时,是否仍会进行身份检查?

  • 有没有办法禁用身份检查?我知道我可以创建自己的自定义证书验证器,但似乎没有办法使用这些来覆盖身份检查.

dns wcf identity certificate

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

在Windows上删除C++中的权限

在Windows上运行的C++应用程序是否有可能在运行时删除权限?

例如,如果用户以管理员身份启动我的应用程序,但没有理由以管理员身份运行我的应用程序,我是否可以某种方式放弃管理员权限?

简而言之,我想在main()函数中编写代码来删除我不需要的权限(例如,Windows目录上的写访问权限).

c++ permissions uac

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

将实体框架与SQL Azure一起使用 - 可靠性

我正在为Windows Azure编写一个应用程序.我正在使用Entity Framework来访问SQL Azure.由于SQL Azure中的限制和其他机制,我需要确保我的代码在SQL语句失败时执行重试.我正试图想出一个可靠的方法来做到这一点.

(在下面的代码中,ObjectSet返回我的EFContext.CreateObjectSet())

假设我有这样的函数:

  public Product GetProductFromDB(int productID)
  {
     return ObjectSet.Where(item => item.Id = productID).SingleOrDefault();
  }
Run Code Online (Sandbox Code Playgroud)

现在,此函数不执行重试,并且迟早会在SQL Azure中失败.一个天真的解决方法是做这样的事情:

  public Product GetProductFromDB(int productID)
  {
     for (int i = 0; i < 3; i++)
     {
        try
        {
           return ObjectSet.Where(item => item.Id = productID).SingleOrDefault();
        }
        catch
        {

        }
     }
  }
Run Code Online (Sandbox Code Playgroud)

当然,这有几个缺点.无论SQL失败,我都会重试(例如,如果它是主键违规则重试是浪费时间),我会立即重试,不会有任何停顿等等.

我的下一步是开始使用Microsoft的Transient Fault Handling库.它包含RetryPolicy,它允许我将重试逻辑与实际查询代码分开:

  public Product GetProductFromDB(int productID)
  {
     var retryPolicy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(5);

     var result = _retryPolicy.ExecuteAction(() =>
        {
           return ObjectSet.Where(item => item.Id = productID).SingleOrDefault;
        });

     return result;
  } …
Run Code Online (Sandbox Code Playgroud)

entity-framework azure azure-sql-database

14
推荐指数
1
解决办法
2410
查看次数

在Windows Server 2012中启动更改

编辑:我原本以为这与.NET Framework 4.5有关.原来它也适用于.NET Framework 4.0.

Windows Server 2012中的字符串处理方式发生了变化,我试图更好地理解它.似乎StartsWith的行为已经改变.使用.NET Framework 4.0和4.5可以重现该问题.

使用Windows 7上的.NET Framework 4.5,下面的程序打印"False,t".在Windows 2012 Server上,它会打印"True,t".

internal class Program
{
   private static void Main(string[] args)
   {
      string byteOrderMark = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
      Console.WriteLine("test".StartsWith(byteOrderMark));
      Console.WriteLine("test"[0]);
   }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,无论字符串内容如何,​​StartsWith(ByteOrderMark)都返回true.如果您有使用以下方法尝试剥离字节顺序标记的代码,此代码将在Windows 7上正常工作,但将在Windows 2012上打印"est".

internal class Program
{
  private static void Main(string[] args)
  {
     string byteOrderMark = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
     string someString = "Test";

     if (someString.StartsWith(byteOrderMark))
        someString = someString.Substring(1);

     Console.WriteLine("{0}", someString);
     Console.ReadKey();

  }
Run Code Online (Sandbox Code Playgroud)

}

我意识到如果你在字符串中有字节顺序标记,你已经做错了,但我们正在与具有此功能的遗留代码集成.我知道我可以通过以下方式解决这个具体问题,但我想更好地理解这个问题.

someString = someString.Trim(byteOrderMark[0]);
Run Code Online (Sandbox Code Playgroud)

Hans Passsant建议使用UTF8Encoding的构造函数,它允许我明确地告诉它发出UTF8标识符.我尝试了这个,但它给出了相同的结果.以下代码在Windows 7和Windows Server 2012之间的输出方面有所不同.在Windows 7上,它打印"Result:False".在Windows Server 2012上,它打印"Result:True".

  private static void …
Run Code Online (Sandbox Code Playgroud)

c# string unicode .net-4.5

13
推荐指数
1
解决办法
2480
查看次数

更新服务引用不起作用

我正在使用Visual Studio 2008并且有一个WCF客户端可以对抗WCF服务.它们都位于相同的Visual Studio解决方案中.在我更改了WCF合同之后,我想更新客户端上的服务引用,以便在代理中对合同进行更改.

我的问题是代理代码没有重新生成.

当我选择更新服务引用时,会发生以下情况:

  1. 将显示一个标题为"正在更新服务引用"参考名称'的对话框.该对话框有一个进度条.
  2. 进度条移动,对话框中的状态文本更改为"正在更新配置"
  3. 进度条移动了一点,状态文本被修改为"配置更新完成"

该对话框没有显示我将加速的文本"Generating\something \"(不记得确切的措辞).

如果我删除服务引用并再次添加它,则会正确生成代理.我使用与以前完全相同的设置添加服务,所以我认为这不是我可以通过更改客户端上的服务引用配置来解决的问题.

我怀疑的一件事可能是我在app.config中重命名了默认的wsHttpBindings.我还重命名了默认端点.这背后的原因是我需要多个端点,并且有一个端点名为'some-default-name',而一个端点有我自己的名字只是令人困惑.

删除服务并再次添加它的问题是Visual Studio在app.config(以及其他内容)中添加了一个不应该存在的新绑定.

以前有人见过这个问题吗?有谁知道它的解决方案?

wcf proxy service-reference

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

来自getaddrinfo的反应缓慢

我正在使用getaddrinfo在Windows上从C++进行DNS查询.我以前使用Windows API DnsQuery并且工作正常,但是当我向我的软件添加IPv6支持时,我切换到了getaddrinfo.从那以后,我见过以下内容:

我的问题是有时候getaddrinfo需要很长时间才能完成.来自getaddrinfo的典型响应只需几毫秒,但大约是10000次的1次,需要更长的时间,在某些情况下大约需要15秒,但有几次需要花费几分钟.

我在服务器上运行Wireshark并分析了我的应用程序调试日志,并看到以下内容:

  • 我调用函数getaddrinfo.
  • 15秒后,我的机器查询DNS服务器.
  • 几毫秒后,我从DNS服务器获得响应.

这里奇怪的是,实际的DNS查询只需要十分之一秒,但getaddrinfo实际执行的时间要长得多.

许多用户已经报告了这个问题,因此它不是我的机器特有的.

那么getaddrinfo除了联系DNS服务器之外还做什么呢?

编辑:

  • 几个地址出现了问题.如果我尝试使用这些地址重现问题,则不会发生此问题.
  • 我做了些蠢事.在每次DNS查询时,都会解析etc/services.但是,这并不能解释几分钟后的延迟.(感谢D.Shawley)

编辑2

  • 我的软件进行的一种DNS查询是反垃圾邮件DNSBL查询.来自一个用户的日志显示,ip.address1.example.com的查找似乎总是花费2039秒,而另一个.ip.address.example.com的查找总是花费1324秒.第二天,这些地址的查找就好了.起初我认为DNS BL的作者已经放弃了某种超时.但如果这是核心问题,getaddrinfo应该提前超时吗?

c++ windows dns performance getaddrinfo-a

9
推荐指数
1
解决办法
5578
查看次数

我可以使用HTTP模块更改传入HTTP请求的内容吗?

我正在尝试扩展我的REST服务(使用WCF/webHttpBinding构建),以便客户端可以上载gzip压缩数据.我不确定最好的方法是什么,但我认为通过添加一个HTTP模块可以相当容易,如果传入请求的Content-Encoding设置为gzip,它将解压缩数据.

所以我创建了一个派生自IHttpModule的类,具有以下实现:

  private void OnBeginRequest(object sender, EventArgs e)
  {
     var app = (HttpApplication) sender;
     var context = app.Context;

     var contentEncoding = context.Request.Headers["Content-Encoding"];

     if (contentEncoding == "gzip")
     {
        // some debug code:
        var decompressedStream = new GZipStream(context.Request.InputStream, CompressionMode.Decompress);
        var memoryStream = new MemoryStream();
        decompressedStream.CopyTo(memoryStream);
        memoryStream.Seek(0, SeekOrigin.Begin);

        var streamReader = new StreamReader(memoryStream);
        string msg = streamReader.ReadToEnd();

        context.Request.InputStream.Seek(0, SeekOrigin.Begin);

        app.Request.Filter = //new TestFilterStream(app.Request.Filter);
                    new System.IO.Compression.GZipStream(
                    app.Request.Filter, CompressionMode.Decompress);
     }

  }
Run Code Online (Sandbox Code Playgroud)

我看到的问题是GZipStream解压缩从未实际执行过.我已经确认传入的数据实际上是gzip(msg变量包含正确的数据).我也尝试在上面创建我自己的流类(TestFilterStream)并将其分配给app.Request.Filter,并且我已经确认ASP.NET实际上没有调用流类上的任何成员.因此,虽然可以指定过滤器,但实际上并未使用该过滤器.

是不是实际使用了HttpApplication.Request.Filter?

c# asp.net wcf gzip filter

8
推荐指数
1
解决办法
2228
查看次数

Elasticsarch:使用单个节点执行重试

我正在使用 NEST 对 Elasticsearch 6 集群执行查询。Elasticsearch 集群由几个节点组成,但它在防火墙/负载均衡器后面运行,因此从客户端角度来看,它显示为具有单个主机名的单个节点。

当部署我的应用程序的新版本时,由于基础设施/网络在蓝绿部署方面的工作方式,会出现短暂的网络中断。

由于我只有一个 Elasticsearch URI,因此当我创建连接时,NEST 将使用 SingleNodeConnectionPool 实例。我在文档 2 中读到,在这种情况下,NEST 将不会执行任何重试。

但就我而言,我想执行重试来处理上述网络中断,因为它当前会导致错误传播到最终用户。我知道我可以自己实现重试逻辑,但我想知道是否有某种方法可以获取网络连接错误的重试逻辑,即使在使用 SingleNodeConnectionPool 时也是如此。

我的代码中出现的错误是:

System.Net.Sockets.SocketException:连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接的主机未能响应而建立的连接失败:

elasticsearch nest retry-logic

7
推荐指数
0
解决办法
253
查看次数

在C++中将宽字符串转换为小写

如何在C++中将wchar_t字符串从大写转换为小写?

该字符串包含日语,中文,德语和希腊字符的混合.

我想过使用towlower ......

http://msdn.microsoft.com/en-us/library/8h19t214%28VS.80%29.aspx

..但文件说:

towlower的案例转换是特定于语言环境的.只有与当前区域设置相关的字符才会被更改.

编辑:也许我应该描述我在做什么.我收到用户的Unicode搜索查询.它最初采用UTF-8编码,但我将其转换为widechar(我的措辞可能不对).我的调试器(VS2008)在"可变快速监视"中正确显示日语,德语等字符.我需要在Unicode中查看另一组数据并查找搜索字符串的匹配项.虽然当搜索区分大小写时,这对我来说没有问题,但是在不区分大小写的情况下更难以解决问题.我(可能是天真的)解决问题的方法是将所有输入数据和输出数据转换为小写,然后进行比较.

c++ lowercase widestring

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