小编Dim*_*kov的帖子

渲染HTML + Javascript服务器端

我需要在服务器端呈现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)

javascript asp.net-mvc dom mshtml

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

使用asp.net Web API 2属性路由创建可以在URI中接受DateTime的路由

我正在尝试查看是否需要编写一个自定义,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,我只是不想做可能内置的事情。

谢谢!

asp.net-web-api asp.net-web-api-routing

3
推荐指数
1
解决办法
9075
查看次数

在没有等待的情况下返回异步方法的结果 - 坏主意?

我正在看一段时间写的一些代码让我非常紧张.问题中方法的一般形状是这样的;

public Task Foo(...){

   SyncMethod();
   SyncMethod();
   ...
   return AsyncMethod();

}
Run Code Online (Sandbox Code Playgroud)

我意识到我可以标记方法asyncawait在最后一次通话时进行,但是......我必须这样做吗?这样可以安全使用吗?在最后一个async方法之前调用的同步方法没有异步替代方法,并且Foo方法不关心AsyncMethod的结果,所以看起来好像只是将等待返回给调用者并让调用者处理它.

另外,FWIW,有问题的代码可能是从一个运行有活动的ASP.NET上下文的线程中调用的,所以我的大脑中有一种刺痛的感觉,那里有一些看不见的邪恶,我在这里看不到?

c# asynchronous async-await

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