小编Ofe*_*lig的帖子

为什么通过UdpClient发送会导致后续接收失败?

我正在尝试创建一个 UDP 服务器,它可以向所有向其发送消息的客户端发送消息。真实情况要复杂一些,但最简单的方法是将其想象为一个聊天服务器:之前发送过消息的每个人都会收到其他客户端发送的所有消息。

所有这些都是通过UdpClient单独的进程完成的。(虽然所有网络连接都在同一个系统内,所以我不认为UDP 的不可靠性不是问题。)

服务器代码是这样的循环(稍后提供完整代码):

var udpClient = new UdpClient(9001);
while (true)
{
    var packet = await udpClient.ReceiveAsync();
    // Send to clients who've previously sent messages here
}
Run Code Online (Sandbox Code Playgroud)

客户端代码也很简单 - 同样,这稍微缩写了,但稍后是完整的代码:

var client = new UdpClient();
client.Connect("127.0.0.1", 9001);
await client.SendAsync(Encoding.UTF8.GetBytes("Hello"));
await Task.Delay(TimeSpan.FromSeconds(15));
await client.SendAsync(Encoding.UTF8.GetBytes("Goodbye"));
client.Close();
Run Code Online (Sandbox Code Playgroud)

这一切都工作正常,直到其中一个客户端关闭它UdpClient(或进程退出)。

下次另一个客户端发送消息时,服务器会尝试将其传播到现已关闭的原始客户端。对此的调用SendAsync不会失败 - 但是当服务器循环回到 时ReceiveAsync因异常而失败,并且我还没有找到恢复的方法。

如果我从不向已断开连接的客户端发送消息,我就永远不会发现问题。基于此,我还创建了一个“立即失败”重现,它仅发送到假设没有监听的端点,然后尝试接收。这会失败并出现相同的异常。

例外:

System.Net.Sockets.SocketException (10054): An existing connection was forcibly closed by the remote host.
   at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.CreateException(SocketError error, …
Run Code Online (Sandbox Code Playgroud)

c# udp udpclient

106
推荐指数
1
解决办法
6999
查看次数

使用默认值将Nullable列更改为NOT NULL

今天我遇到了一个旧表,其中一个名为"Created"的日期时间列允许空值.现在,我想要更改它,使其为NOT NULL,并且还包含一个约束以添加默认值(getdate()).

到目前为止,我已经得到了以下脚本,只要我事先清理了所有空值,它就可以正常工作:

ALTER TABLE dbo.MyTable ALTER COLUMN Created DATETIME NOT NULL 
Run Code Online (Sandbox Code Playgroud)

有没有办法在ALTER语句中同时指定默认值?

sql sql-server alter-table alter-column

61
推荐指数
3
解决办法
15万
查看次数

使用Reflection获取父类的名称

如何使用Reflection获取某些类的父类的名称?

.net reflection

41
推荐指数
6
解决办法
3万
查看次数

使用BookSleeve维护打开的Redis连接

有没有人有通过BookSleeve库获取Redis的可靠模式?

我的意思是:

BookSleeve的作者@MarcGravell 建议不要每次都打开和关闭连接,而是在整个应用程序中保持一个连接.但是你怎么能处理网络中断?即,连接可能首先成功打开,但是当某些代码尝试读取/写入Redis时,连接可能已经丢失,您必须重新打开它(如果它不能打开,则会优雅地失败 - 但是这取决于您的设计需求.)

我寻找覆盖一般Redis连接开放的代码片段,以及在每次读/写之前使用的一般"活动"检查(+可选唤醒,如果不活动).

这个问题表明对这个问题有一个很好的态度,但它只是部分(例如,它没有恢复丢失的连接),并且该问题的接受答案采用了正确的方式,但没有展示具体的代码.

我希望这个主题得到可靠的答案,并最终成为一个关于BookSleeve在.Net应用程序中使用的Wiki.

-----------------------------

重要更新(2014年3月21日):

-----------------------------

马克Gravell(@MarcGravell)/堆栈交易所已经最近发布StackExchange.Redis库,最终取代Booksleeve.除了别的以外,这个新库在内部处理重新连接并使我的问题变得多余(也就是说,它对于Booksleeve来说并不是多余的,也不是我的答案,但我想最好的方法是开始使用新的StackExchange.Redis库).

c# redis booksleeve

26
推荐指数
1
解决办法
8348
查看次数

Razor中()(括号)和{}(花括号)之间的差异

它们之间有什么区别.我以为他们是一样的,但今天我意识到他们不是.

为什么这是正确的

@(Model.WillAttend == true ? 
    "This will be an exciting party with you" : 
    "So sorry. You'll lose the beeer")
Run Code Online (Sandbox Code Playgroud)

这不是:

@{Model.WillAttend == true ? 
    "This will be an exciting party with you" : 
    "So sorry. You'll lose the beeer"}
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc razor asp.net-mvc-3

23
推荐指数
3
解决办法
7868
查看次数

MVC3 AntiForgeryToken打破了Ajax登录

ASP.NET MVC的AntiForgeryToken机制基于当前HttpContext.User.它在您调用时使用该值来构造令牌Html.AntiForgeryToken().基本上没关系(请参阅此处最后一段中的解释)但是当您通过Ajax调用登录时会出现问题.

在我的代码中,当用户登录时,凭据在Ajax中作为Json对象发送(AntiForgeryToken隐藏字段值也在Json内发送),服务器验证用户,应用FormsAuthentication.SetAuthCookie(),并返回Json结果包含一些用户特定的数据.这样,我可以在登录时避免整页刷新.

问题是现在每个后续的Ajax请求都会失败ValidateAntiForgeryTokenAttribute,因为它现在需要一个与防伪cookie不兼容的防伪标记.

如何将有效的防伪标记放入客户端的隐藏字段中,以便登录后的每个Json请求都会成功?

我试图手动获取一个新的隐藏字段标记(AntiForgery.GetHtml()在操作上使用,提取标记字符串本身,将其返回到Json中的客户端并在JavaScript中手动将其放置在防伪隐藏字段中)但它不起作用 - ValidateAntiForgeryTokenAttribute服务器上的后续Ajax调用失败.事实上,每次调用AntiForgery.GetHtml()(基本上是Html.AntiForgeryToken()帮助程序所做的)都会产生一个不同的令牌,这会使前一个令牌失效.

我也试着设置HttpContext.User = new GenericPrincipal(new GenericIdentity(email), null);详见这里,但它不工作.

注意: 由于我的具体情况,此解决方案对我不起作用:Ajax 登录更改服务器上的用户身份,因此登录前生成的每个令牌都无效; 此解决方案也不适用,因为它解决了不同的问题.

security ajax asp.net-mvc antiforgerytoken asp.net-mvc-3

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

几分钟后,信号器停止进行回调

我在aspx-Page上使用signalr 0.4,

var hub = $.connection.FooHub;

hub.disconnected(function () {                
            log("Server has disconnected");
        });

hub.ShowInfo = function (Info) { .... }

$("#Button1").click(function () {
            hub.FooFunction('foo');
        });

$.connection.hub.start();
Run Code Online (Sandbox Code Playgroud)

集线器定义为:

public class FooHub : Hub, IDisconnect
{    
    ~FooHub()
    {
        log.Debug("FooHub Destroy");
    }
    public FooHub()
    {
        log.Debug("FooHub Startup");
    }    
    public bool FooFunction(string stuff)
    {
        log.Debug("Hub FooFunction");
        Clients.ShowInfo(someInfo);
        return true;
    }
    public Task Disconnect()
    {
        // Query the database to find the user by it's client id etc. etc.
        MyController.Disconnect(Context.ConnectionId);
        log.Debug("Hub Disconnnect " + Context.ConnectionId); …
Run Code Online (Sandbox Code Playgroud)

asp.net signalr

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

关于新的EF5自动编译查询功能

我对新的EF5自动编译查询功能进行了一些测试.问题是我没有看到性能上的任何差异.

我使用.NET 4.0和EF4.0创建了一个项目而不使用编译查询.我用.NET 4.0和EF4.0创建了另一个带有编译查询的项目 - 性能提高了50%.

然后我尝试用EF 5.0创建一个项目,其中性能基本没有差异.

所有项目都是asp.net mvc(前两个是版本3,最后一个是版本4).

我在这里错过了什么吗?为了启用自动编译功能,我需要做些什么特别的事情吗?我刚刚创建了预构建EF5的MVC 4项目.

我正在测试的查询相当冗长,内部有三个连接和多个过滤器.

谢谢

.net entity-framework entity-framework-5

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

如何让Require.js获取一个不以`.js`结尾的脚本?

我正在开发一个使用某个网站来简化付款的应用,并且它处理付款的方式需要从https://bridge.paymill.com/包含该脚本的此网址导入一些javascript .

事实是,我正在使用require js加载所有脚本,在我的main.js配置中,我试图这样做:

requirejs.config({
  ...
  'paymill': 'https://bridge.paymill.com/',
  ...
});
Run Code Online (Sandbox Code Playgroud)

但是,当然,这会尝试从中获取https://bridge.paymill.com/.js,这不是正确的URL(它没有最后的.js)

我怎么能通知requirejs加载它而不在末尾附加'.js'?

javascript requirejs

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

如何在保存到磁盘之前压缩文件?

我想在物理上保存在磁盘上之前压缩文件.

我尝试使用压缩和解压缩方法(MSDN示例代码),但所有方法都需要一个已经物理存储在磁盘上的文件.

c# c#-4.0

5
推荐指数
1
解决办法
2784
查看次数