我正在尝试创建一个 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) 今天我遇到了一个旧表,其中一个名为"Created"的日期时间列允许空值.现在,我想要更改它,使其为NOT NULL,并且还包含一个约束以添加默认值(getdate()).
到目前为止,我已经得到了以下脚本,只要我事先清理了所有空值,它就可以正常工作:
ALTER TABLE dbo.MyTable ALTER COLUMN Created DATETIME NOT NULL
Run Code Online (Sandbox Code Playgroud)
有没有办法在ALTER语句中同时指定默认值?
有没有人有通过BookSleeve库获取Redis的可靠模式?
我的意思是:
BookSleeve的作者@MarcGravell 建议不要每次都打开和关闭连接,而是在整个应用程序中保持一个连接.但是你怎么能处理网络中断?即,连接可能首先成功打开,但是当某些代码尝试读取/写入Redis时,连接可能已经丢失,您必须重新打开它(如果它不能打开,则会优雅地失败 - 但是这取决于您的设计需求.)
我寻找覆盖一般Redis连接开放的代码片段,以及在每次读/写之前使用的一般"活动"检查(+可选唤醒,如果不活动).
这个问题表明对这个问题有一个很好的态度,但它只是部分(例如,它没有恢复丢失的连接),并且该问题的接受答案采用了正确的方式,但没有展示具体的代码.
我希望这个主题得到可靠的答案,并最终成为一个关于BookSleeve在.Net应用程序中使用的Wiki.
-----------------------------
重要更新(2014年3月21日):
-----------------------------
马克Gravell(@MarcGravell)/堆栈交易所已经最近发布的StackExchange.Redis库,最终取代Booksleeve.除了别的以外,这个新库在内部处理重新连接并使我的问题变得多余(也就是说,它对于Booksleeve来说并不是多余的,也不是我的答案,但我想最好的方法是开始使用新的StackExchange.Redis库).
它们之间有什么区别.我以为他们是一样的,但今天我意识到他们不是.
为什么这是正确的
@(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的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 登录更改服务器上的用户身份,因此登录前生成的每个令牌都无效; 此解决方案也不适用,因为它解决了不同的问题.
我在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) 我对新的EF5自动编译查询功能进行了一些测试.问题是我没有看到性能上的任何差异.
我使用.NET 4.0和EF4.0创建了一个项目而不使用编译查询.我用.NET 4.0和EF4.0创建了另一个带有编译查询的项目 - 性能提高了50%.
然后我尝试用EF 5.0创建一个项目,其中性能基本没有差异.
所有项目都是asp.net mvc(前两个是版本3,最后一个是版本4).
我在这里错过了什么吗?为了启用自动编译功能,我需要做些什么特别的事情吗?我刚刚创建了预构建EF5的MVC 4项目.
我正在测试的查询相当冗长,内部有三个连接和多个过滤器.
谢谢
我正在开发一个使用某个网站来简化付款的应用,并且它处理付款的方式需要从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'?
我想在物理上保存在磁盘上之前压缩文件.
我尝试使用压缩和解压缩方法(MSDN示例代码),但所有方法都需要一个已经物理存储在磁盘上的文件.
c# ×3
.net ×2
asp.net-mvc ×2
ajax ×1
alter-column ×1
alter-table ×1
asp.net ×1
booksleeve ×1
c#-4.0 ×1
javascript ×1
razor ×1
redis ×1
reflection ×1
requirejs ×1
security ×1
signalr ×1
sql ×1
sql-server ×1
udp ×1
udpclient ×1