我需要在服务器端呈现HTML页面并"提取"canvas元素的原始字节,以便将其保存到PNG.问题是,canvas元素是从javascript创建的(我使用jquery的Flot生成一个图表,基本上).所以我想我需要一种在没有实际使用浏览器的情况下从浏览器"托管"DOM + Javascript功能的方法.我决定使用mshtml(但对任何和所有建议开放),因为它似乎应该能够完全实现.这是一个ASP.NET MVC项目.
我搜索得很远,没有看到任何结论.
所以我有这个简单的HTML - 示例尽可能简单地说明问题 -
<!DOCTYPE html>
<html>
<head>
<title>Wow</title>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.1.min.js" type="text/javascript"></script>
</head>
<body>
<div id="hello">
</div>
<script type="text/javascript">
function simple()
{
$("#hello").append("<p>Hello</p>");
}
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
从浏览器运行时产生预期的输出.
我希望能够将原始HTML加载到内存中,执行javascript函数,然后操作最终的DOM树.我不能使用任何类似System.Windows.WebBrowser的类,因为我的代码需要在服务环境中运行.
所以这是我的代码:
IHTMLDocument2 domRoot = (IHTMLDocument2)new HTMLDocument();
using (WebClient wc = new WebClient())
{
using (var stream = new StreamReader(wc.OpenRead((string)url)))
{
string html = stream.ReadToEnd();
domRoot.write(html);
domRoot.close();
}
}
while (domRoot.readyState != "complete")
Thread.Sleep(SleepTime);
string beforeScript = domRoot.body.outerHTML;
IHTMLWindow2 parentWin = domRoot.parentWindow;
parentWin.execScript("simple");
while (domRoot.readyState != "complete") …Run Code Online (Sandbox Code Playgroud) 我正在尝试查看是否需要编写一个自定义,IHttpRouteConstraint或者是否可以与内置的内容搏斗以获取所需的内容。我看不到任何关于此的好的文档。
基本上,这是我的操作:
[Route("var/{varId:int:min(1)}/slot/{*slot:datetime}")]
public async Task<HttpResponseMessage> Put(int varId, DateTime slot)
{
...
}
Run Code Online (Sandbox Code Playgroud)
我想要的是能够这样称呼它:
PUT /api/data/var/1/slot/2012/01/01/131516并让框架将19绑定到var id和DateTime一个值为“ slot”的值“ aJan 1st,2012,1:15:16 pm”。
按照此处的指南进行操作:http : //www.asp.net/web-api/overview/web-api-routing-and-actions/create-a-rest-api-with-attribute-routing我能够它只能通过传递日期段(即PUT /api/data/var/1/slot/2012/01/01或)来工作PUT /api/data/var/1/slot/2012-01-01,但这只给我一个数据值,没有时间成分。
有人告诉我,尝试以任何合理的方式在URI段中传递时间是一个坏主意,但是我不确定为什么这会是个坏主意,除了在本地时间与UTC时间上存在歧义。
我也尝试过datetime使用正则表达式{slot:datetime:regex(\\d{4}/\\d{2}/\\d{2})/\\d{4})}来约束约束,例如试图使其解析2013/01/01/151617为诸如DateTime之类的东西,但无济于事。
我很确定我可以将其与自定义一起使用IHttpRouteConstraint,我只是不想做可能内置的事情。
谢谢!
我正在看一段时间写的一些代码让我非常紧张.问题中方法的一般形状是这样的;
public Task Foo(...){
SyncMethod();
SyncMethod();
...
return AsyncMethod();
}
Run Code Online (Sandbox Code Playgroud)
我意识到我可以标记方法async并await在最后一次通话时进行,但是......我必须这样做吗?这样可以安全使用吗?在最后一个async方法之前调用的同步方法没有异步替代方法,并且Foo方法不关心AsyncMethod的结果,所以看起来好像只是将等待返回给调用者并让调用者处理它.
另外,FWIW,有问题的代码可能是从一个运行有活动的ASP.NET上下文的线程中调用的,所以我的大脑中有一种刺痛的感觉,那里有一些看不见的邪恶,我在这里看不到?