我的泛型方法需要序列化传递给它的对象,但只是坚持它实现ISerializable似乎不起作用.例如,我有一个从Web服务(标记为SerializableAttribute)返回的结构,它可以很好地序列化为xml,但正如预期的那样,C#编译器会抱怨.
有没有办法在尝试序列化之前检查对象是否可序列化,或者更好的是,使用where
关键字检查对象的方法是否合适?
这是我的完整方法:
public static void Push<T>(string url, T message)
where T : ISerializable
{
string xml = SerializeMessage(message);
// Send the message to Amazon SQS
SendMessageRequest sendReq = new SendMessageRequest { QueueUrl = url, MessageBody = xml };
AmazonSQSClient client = new AmazonSQSClient(S3User, S3Pass);
client.SendMessage(sendReq);
}
Run Code Online (Sandbox Code Playgroud)
和SerializeMessage:
private static string SerializeMessage<T>(T message)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
using (StringWriter stringWriter = new StringWriter())
{
xmlSerializer.Serialize(stringWriter, message);
return stringWriter.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
如果这不可能,那么在运行时检查对象是否可序列化的最佳方法是什么?
我想知道是否有一种确保Image对象引用完全黑色图像的超高效方法,因此位图中的每个像素都是ARGB(255,0,0,0).
你会推荐什么?这些位图中的大多数将是1024 x 6000像素(尽管假设它们总是那么大,这是不安全的).
我需要这个,因为我们遇到了PrintWindow API的问题.我们发现近20%的时间,至少图像的某些部分将是黑色方块(后续捕获将成功).我想解决这个问题的方法是在每个子窗口中调用PrintWindow或WM_PRINT,然后将窗口的整个图像重新组合在一起.如果我能找到一种有效的方法来检测PrintWindow为特定子窗口返回黑色图像,那么我可以在该捕获上再次快速调用PrintWindow.它很糟糕,但PrintWindow是捕获适用于所有窗口(我想要的)窗口的唯一方法,并支持捕获隐藏和/或屏幕外的窗口.
当PrintWindow失败时,它不会设置错误代码或返回任何指示失败的内容.当它出现这个黑色方块问题时,它总是整个窗口或子窗口返回黑色.因此,通过分别捕获每个子窗口,我可以确定每个捕获都有效,只要它包含至少一个非黑色像素.
显然,PrintWindow在Vista及更高版本中更好,但在这种情况下,我们仅限于Server 2003.
我意识到这是一个早期发布并且不稳定.我不会梦想在任何其他项目中替换IE9的默认webbrowser控件,但在这种情况下我特别需要IE9与其他版本进行比较.
我想让.NET WebBrowser控件使用IE9而不是机器上的默认IE版本.我可以完全控制机器,因此破解系统文件或其他任何可能需要的东西都没有问题.
通常,这可以通过将更新安装到IE来实现,但在IE9的情况下,它会安装一个单独的应用程序,使IE的当前版本保持不变.这意味着WebBrowser控件继续使用当前版本(这很有意义并且是MS的智能举措,因为IE9仍处于开发阶段).但在我的(边缘)情况下,我需要WebBrowser控件来使用IE9.
是否可以在.NET表单应用程序中嵌入IE9?
编辑
在Hans Passant的帮助下,我得到了更多.在IE9的prog文件目录中发生了一些非常有趣的事情.有一个名为"iepreview.exe.local"的目录,当删除时,会使IE9预览应用程序使用IE8(使用acid3测试检查).
不是我想要的,但我想知道这是否是我可以根据我的需要进行的某种重定向.
编辑2
我已经尝试将.local hack应用于我的iexplore.exe和我的.NET应用程序的副本,我注意到其他有趣的东西 - 两个应用程序都开始使用IE7而不是IE8(我的IE版本)或IE9.
这可能是iexplore试图使用IE9然后再回到IE7?看起来很奇怪它甚至可以使用IE7,但这是它开始使用的useragent字符串.
据我了解,TcpListener
一旦你打电话就会排队连接Start()
.每次调用AcceptTcpClient
(或BeginAcceptTcpClient
)时,它都会从队列中出列一个项目.
如果我们TcpListener
通过立即向它发送1,000个连接来加载测试我们的应用程序,那么队列构建的速度远远超过我们清除它的速度,导致(最终)从客户端超时,因为它没有得到响应,因为它的连接仍在队列.但是,服务器似乎没有太大的压力,我们的应用程序不会消耗太多CPU时间,并且机器上的其他受监控资源也不会让人痛苦.感觉就像我们现在没有足够高效地运行.
我们正在调用BeginAcceptTcpListener
然后立即移交给一个ThreadPool
线程来实际完成工作,然后BeginAcceptTcpClient
再次调用.所涉及的工作似乎没有对机器施加任何压力,它基本上只是一个3秒的睡眠,然后是字典查找,然后是100字节写入TcpClient
流.
这是TcpListener
我们使用的代码:
// Thread signal.
private static ManualResetEvent tcpClientConnected = new ManualResetEvent(false);
public void DoBeginAcceptTcpClient(TcpListener listener)
{
// Set the event to nonsignaled state.
tcpClientConnected.Reset();
listener.BeginAcceptTcpClient(
new AsyncCallback(DoAcceptTcpClientCallback),
listener);
// Wait for signal
tcpClientConnected.WaitOne();
}
public void DoAcceptTcpClientCallback(IAsyncResult ar)
{
// Get the listener that handles the client request, and the TcpClient
TcpListener listener = (TcpListener)ar.AsyncState;
TcpClient client …
Run Code Online (Sandbox Code Playgroud) 我在Amazon EC2负载均衡器后面有几个Web服务器.我在端口80上使用TCP平衡(而不是HTTP平衡).
我有一个客户端每隔几秒钟轮询一个Web服务(在所有Web服务器上运行)以获取新项目.但是,客户端似乎保持连接到一台服务器并每次轮询同一台服务器.
我已经尝试使用ServicePointManager来禁用KeepAlive,但这并没有改变任何东西.传出连接仍然具有"connection:keep-alive"HTTP标头,并且服务器保持TCP连接打开.我还尝试将GetWebRequest的重写添加到由VS创建的代理类中,该代理类继承自SoapHttpClientProtocol,但我仍然看到了keep-alive标头.
如果我终止客户端进程并重新启动,它将通过负载均衡器连接到新服务器,但它将继续永久轮询该新服务器.
有没有办法强制它每次都连接到随机服务器?我希望来自一个客户端的负载分布在所有Web服务器上.
客户端使用C#编写(与服务器一样)并使用Web引用(不是服务引用),它指向负载均衡器.
我有一个重叠矩形的理论网格,可能看起来像这样:
但我必须使用的是Rectangle对象的集合:
var shapes = new List<Rectangle>();
shapes.Add(new Rectangle(10, 10, 580, 380));
shapes.Add(new Rectangle(15, 20, 555, 100));
shapes.Add(new Rectangle(35, 50, 40, 75));
// ...
Run Code Online (Sandbox Code Playgroud)
我想要做的是构建一个类似DOM的结构,其中每个矩形都有一个ChildRectangles属性,该属性包含网格中包含的矩形.
最终结果应该允许我将这样的结构转换为XML,类似于:
<grid>
<shape rectangle="10, 10, 580, 380">
<shape rectangle="5, 10, 555, 100">
<shape rectangle="20, 30, 40, 75"/>
</shape>
</shape>
<shape rectangle="etc..."/>
</grid>
Run Code Online (Sandbox Code Playgroud)
但它主要是我想要的内存中类似DOM的结构,输出XML只是我如何使用这种结构的一个例子.
我坚持的是如何有效地确定哪个矩形属于哪个.
注意没有矩形部分包含在另一个中,它们总是完全在另一个内部.
编辑通常会有数百个矩形,我应该遍历每个矩形以查看它是否包含在另一个矩形中?
编辑有人建议包含(不是我最好的时刻,错过了!),但我不确定如何最好地构建DOM.例如,取第一个矩形的孙子,父母确实包含孙子,但它不应该是直接的孩子,它应该是父母的第一个孩子的孩子.
据我了解,Safari和Chrome都使用WebKit.有许多项目允许您嵌入WebKit,但我希望我真的想要在C#应用程序中嵌入Chrome(适用于Windows),以便我的应用程序呈现与Windows上的Chrome相同.
因此,当我嵌入AwesomiumDotNet时,渲染,CSS支持,Javascript引擎,字体渲染等是否适用于Chrome for Windows或底层WebKit引擎?
据推测,WebKit不处理字体和控件渲染之类的东西,或者Windows上的Chrome和Safari看起来完全相同,但它们却没有(Safari有模糊的文字发生,其他差异).
WebKit是否负责布局和计算样式,而构建在WebKit之上的浏览器是否提供实际渲染?或者更多的是,苹果和谷歌使用的项目不久前分叉了,这就是为什么它们不同?
有什么东西总是让我对SPF感到困扰,为什么它不验证From头?
据我了解,SMTP服务器将SPF验证MAIL FROM或ENVELOPE FROM SMTP命令期间提供的主机名(我的示例是从telnet'ing到gmail-smtp-in.l.google.com:
MAIL FROM:<matt@example.com>
Run Code Online (Sandbox Code Playgroud)
Gmail然后做了它的事情,确保我的example.com的SPF记录允许我的IP发送.但是这里它似乎倒下了,我不能只注册一个域,为我的IP正确设置我的TXT和SPF记录,然后发送?完整示例:
$ telnet gmail-smtp-in.l.google.com 25
Trying 173.194.68.27...
Connected to gmail-smtp-in.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP m6si2285029qao.20 - gsmtp
HELO ec2-23-22-210-XXX.compute-1.amazonaws.com
250 mx.google.com at your service
MAIL FROM:<matt@ec2-23-22-210-XXX.compute-1.amazonaws.com>
250 2.1.0 OK m6si2285029qao.20 - gsmtp
RCPT TO:<(a real gmail address)@gmail.com>
250 2.1.5 OK m6si2285029qao.20 - gsmtp
DATA
354 Go ahead m6si2285029qao.20 - gsmtp
From: "Litmus" <hello@litmus.com>
To: <anybody@example.com>
Subject: Welcome to Litmus!
Date: Thu, 27 June 2013 16:24:30 -0500
Welcome!
.
250 2.0.0 …
Run Code Online (Sandbox Code Playgroud) 我刚刚在我的.net项目中添加了另一个第三方组件,其中包含一个被调用的类Client
,它让我想到了常见的类名.
您是否将公共类命名为常见Client
,或者您是否尝试使名称更具体?
在过去我会说Client
很好,因为它总是可以通过其namespace(Company.Product.Client
)显式访问,但MS似乎坚持.net框架中更具描述性的类名,例如WebClient
,TcpClient
和SmtpClient
.
我觉得这些名字MessagePub.Client
看起来很整洁,而且MessagePub.MessagePubClient
不那么简单,但是随后大量Client
漂浮的东西也会让人感到非常混乱.
我正在使用的所有这些第三方组件实际上都是开源的,因此建议重构并将其类名更改为更具描述性的内容,以使我的代码更具可读性或通过其命名空间访问更好的主意?还是没关系?:-)
我们使用以下代码来创建安全cookie.在Staging环境中一切正常,但在生产环境中,以下代码无法在Safari,Chrome或IE中创建cookie,但它确实在Firefox中成功创建了cookie.你们认为我遗失或错在这里的任何事情?
public static void SetAuthenticationCookie(CustomIdentity identity)
{
ConfigSettings configSettings = ConfigHelper.GetConfigSettings();
string cookieName = configSettings.CookieName;
if (cookieName == null || cookieName.Trim() == String.Empty)
{
throw new Exception("CookieName entry not found in Web.config");
}
string cookieExpr = configSettings.CookieExpiration.ToString();
string encryptedUserDetails = Encrypt(identity);
HttpCookie userCookie = new HttpCookie(cookieName.ToUpper());
if (cookieExpr != null && cookieExpr.Trim() != String.Empty)
{
userCookie.Expires = DateTime.Now.AddMinutes(int.Parse(cookieExpr));
}
userCookie.Values["UserDetails"] = encryptedUserDetails;
userCookie.Values["Culture"] = configSettings.Customer.Culture;
MyContext.Current.Response.Cookies.Add(userCookie);
}
Run Code Online (Sandbox Code Playgroud) 是否有任何(希望是免费/开源)代码可以进行本机TLS/SSL通信?我不谈论HTTPListener/Client和WebRequest类.我想在我的C#代码中进行原始TLS通信.
提前谢谢,马克斯
我不会深入了解为什么我需要它的无聊细节,它是内部分析包的一部分,但我的目标是创建一个在2秒后返回重定向的ASP.NET页面.
我看到的问题是使用Thread.Sleep(2000);
将阻止我的一个ASP.NET ThreadPool线程.据我所知,这非常浪费,因为线程创建并不便宜,我需要这台服务器来处理尽可能多的可能的同时连接.
那么,在至少 2秒后让HTTP GET返回页面的最佳方法是什么(超过2秒没问题,它就不能用了).
protected void Page_Load(object sender, EventArgs e)
{
Thread.Sleep(2000);
Response.Redirect(RedirectUri);
}
Run Code Online (Sandbox Code Playgroud)
编辑
我应该澄清一下,请求的页面实际上是作为图像请求的,因此无法返回HTML.它会像这样使用:
<img src="http://hostname/record.aspx"/>
Run Code Online (Sandbox Code Playgroud)
重定向到实际图像需要2秒钟.
protected override void OnStart(String[] args)
{
ResultManager.PrepareCache();
ThreadPool.QueueUserWorkItem(ResultQueue.Process);
ThreadPool.QueueUserWorkItem(StatusUpdater.UpdateStatus);
ThreadPool.QueueUserWorkItem(GeneralQueue.RestartHungTests);
ThreadPool.QueueUserWorkItem(ResultManager.SyncroniseResultsTable);
ThreadPool.QueueUserWorkItem(GeneralQueue.RecoverLostResults);
ThreadPool.QueueUserWorkItem(BrowserTestStartInfo.FillQueues);
ThreadPool.QueueUserWorkItem(MailAppAccount.FillQueues);
}
Run Code Online (Sandbox Code Playgroud)
这些任务中的每一个都在Windows服务的生命周期内运行.我一直坚持使用ThreadPool来做这种事情,我应该只是开始正常的线程吗?我可以确定ThreadPool有足够的线程来运行每个任务吗?如果我将SetMaxThreads设置为7,我会在以后遇到问题,因为这些线程永远不会中止吗?将它设置为更高的东西是否安全?
我总是希望所有7个线程同时运行,它们永远不会中止 - 我是否应该使用线程?还有其他更适合这种永久性运行的任务吗?
每个任务每x分钟运行一个特定的方法.
c# ×12
.net ×6
asp.net ×2
sockets ×2
attributes ×1
bitmap ×1
class-design ×1
com ×1
cookies ×1
email ×1
embed ×1
generics ×1
geometry ×1
http ×1
image ×1
keep-alive ×1
safari ×1
serializable ×1
smtp ×1
spf ×1
ssl ×1
tcpclient ×1
tcplistener ×1
threadpool ×1
web-services ×1
webkit ×1