c# - 使用 C# 将数据发送到接受 JSON 数据的通用处理程序

标签 c# javascript jquery asp.net json

我有一种情况,我正在访问 ASP.NET 通用处理程序以使用 JQuery 加载数据。但是由于从 JavaScript 加载的数据对搜索引擎爬虫来说是不可见的,所以我决定从 C# 加载数据,然后为 JQuery 缓存它。我的处理程序包含很多逻辑,我不想在后面的代码上再次应用这些逻辑。这是我的处理程序代码:

public void ProcessRequest(HttpContext context)
        {
            JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
            string jsonString = string.Empty;

            context.Request.InputStream.Position = 0;
            using (var inputStream = new System.IO.StreamReader(context.Request.InputStream))
            {
                jsonString = inputStream.ReadToEnd();
            }

            ContentType contentType = jsonSerializer.Deserialize<ContentType>(jsonString);
            context.Response.ContentType = "text/plain";
            switch (contentType.typeOfContent)
            {
                case 1: context.Response.Write(getUserControlMarkup("SideContent", context, contentType.UCArgs));
                    break;
            }
        }

我可以调用函数 getUserControlMarkup()来自 C#,但我必须在调用它时应用一些基于 URL 的条件。 contentType.typeOfContent实际上是基于URL参数。

如果可能将 JSON 数据发送到此处理程序,请告诉我该怎么做。我正在尝试像这样访问处理程序:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Common.host + "Handlers/SideContentLoader.ashx?typeOfContent=1&UCArgs=cdata");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

但它给予 NullReferenceException在行的处理程序代码中: ContentType contentType = jsonSerializer.Deserialize<ContentType>(jsonString);

最佳答案

一个很好的方法是使用路由。 在 Global.asax 中

protected void Application_Start(object sender, EventArgs e)
{
  RegisterRoutes(RouteTable.Routes);
}        

private void RegisterRoutes(RouteCollection routes)
{
  routes.MapHttpHandlerRoute("MyRouteName", "Something/GetData/{par1}/{par2}/data.json", "~/MyHandler.ashx");
}

这是告诉 ASP.Net 在 /Something/GetData/XXX/YYY/data.json 上调用您的处理程序。

您可以在处理程序中访问路由参数: context.Request.RequestContext.RouteData.Values["par1"]

爬虫将解析 URL,只要它们在某处被引用(即机器人文件或链接)

关于c# - 使用 C# 将数据发送到接受 JSON 数据的通用处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23157685/

相关文章:

javascript - 如果复选框默认选中,setInterval 并执行某些操作,如果未选中,则 clearInterval

javascript - 在 Javascript 中扩展类

javascript - JQuery 选择性隐藏不起作用

java - GWT 和 JQuery 共存

javascript - 如何知道 jquery 中的元素附加了哪个处理程序?

c# - geckodriver.exe 不在当前目录或路径变量中,Selenium 2.53.1 + Firefox 48 + Selenium 3 Beta

c# - 系统.InvalidOperationException : 'No suitable constructor found for entity type ' HealthCheck'

c# - 如何避免在每个 Controller 中重复一个参数?

c# - 使用 Autofac 解析 IRepository<T> 的多个具体类?

javascript - 无法使用 javascript 或 jquery 将 '</div> <div>' 插入 html 页面中的位置