分类
Web编程

Asp.net中解决“请求超时”的问题

在数据库或者请求操作时,如果选择的时间段过短或操作数据量过大,就会遇到”请求超时”的的问题,网络上提供很多解决方案,但普遍不完善,根据个人经验及参考网络解决方案,先将其汇总
在数据库或者请求操作时,如果选择的时间段过短或操作数据量过大,就会遇到”请求超时”的的问题,网络上提供很多解决方案,但普遍不完善,根据个人经验及参考网络解决方案,先将其汇总如下:根据错误类型,大致分为如下几种情况
1:Asp.net请求超时
2:IIS请求超时
3:数据库连接超时
4: 数据库操作超时
5:应用程序池回收(低)
6:Webservice等服务请求超时

下面根据上述情况一一作出处理
1:Asp.net请求超时
http请求超时可以在webconfig中进行全局配置,(单位为秒,默认为90秒)如下
<system.web>
<httpRuntime maxRequestLength=”102400″ executionTimeout=”180″ />
<system.web>

2:IIS请求超时
直接去IIS进行设置:IIS-网站-属性   设置一个较大的值,但是不能太大,具体情况具体分析。

3:数据库连接超时
在配置数据库连接字符串的时候一起配置
<connectionStrings>
<add name=”MarketingMate” connectionString=”Data Source=192.168.1.1; Database=MarketingMate; User Id=sa; Password=123; Connect Timeout=30;Min Pool Size=16;Max Pool Size=100;”
providerName=”System.Data.SqlClient”/>
connectionStrings>

4. 数据库操作超时
数据库操作超时目前还没有全局设置方法,只能设置Command类的CommandTimeOut属性(单位为秒,默认为30秒)
context.CommandTimeout = 180;

5:应用程序池回收(底)这种出现的情况很低,请酌情设置
应用程序池会在一定的时间内回收线程,直接设置即可:应用程序池–属性–回收工作进程

6:Webservice等服务请求超时 (这种是参考网上提供的解决方法,本人没遇到过)
扩大代理类的超时限制,默认是90秒  ,即在调用方法前指定超时时间。
[csharp]YourWebService yws = new YourWebService(); yws.Timeout = 1200000; //20分钟,单位是毫秒[/csharp]
如果将 Timeout 属性设置为 Timeout.Infinite,则指示该请求无超时。即使 XML Web services 客户端可以将 Timeout 属性设置为无超时,Web 服务器仍可以在服务器端使请求超时。

分类
Web编程

aspx最小化html 压缩html 去空字符

对网站的代码、资源的压缩,可以提高网站打开速度,减少请求次数,节省流量,提高用户体验等,好处肯定多了 最重要的是不用花一分钱。

我一直觉得一个优秀的站长,一定不能是开发者。我个人就是身有所处,开发者总希望把自己的程序优化到极致,无止尽的折腾,不断的最求完美。虽然说是细节可以决定成败,其实更多时候任何优化都不是关键,时机才是最重要的。说了这么多,又跑题了。。。

压缩包括web服务器的压缩,比如iis6,7就有动态压缩 静态压缩gzip,其实那些都是web服务器和解析的浏览器之间的压缩方式,如果你是个coder,当然还可以进一步的压缩。

之前应该介绍过使用AjaxMin,YUICompressor.NET等工具压缩css和js等文件(不记得是否真写过了)。至于html的压缩,在C#方向的资源比较少见,大家可以看ikanman.com,右键查看源代码,里面的html代码是没有任何空字符比如换行、空格和注释文字的,其实源码里面当然有 不然怎么看得懂呢。

原来我是用的是用正则的方式来去除空字符,代码如下:

protected string WhitespaceFilter(string html){
 html = Regex.Replace(html, "^\s*", string.Empty, RegexOptions.Compiled | RegexOptions.Multiline);
 html = Regex.Replace(html, "\r\n", string.Empty, RegexOptions.Compiled | RegexOptions.Multiline);
 html = Regex.Replace(html, "<!--*.*?-->", string.Empty, RegexOptions.Compiled | RegexOptions.Multiline);
 return html;
 }

如果希望压缩aspx自动输出的html代码,可以覆盖Render方法来实现,代码如下:

//把动态页面去空格 
 protected override void Render(HtmlTextWriter writer)
 {
 System.IO.StringWriter html = new System.IO.StringWriter();
 System.Web.UI.HtmlTextWriter tw = new System.Web.UI.HtmlTextWriter(html);
 base.Render(tw);
 tw.Close();
 string outhtml = html.ToString();
#if !DEBUG
 outhtml = WhitespaceFilter(outhtml);//去空格
#endif
 writer.Write(outhtml);
 }

注意#if !DEBUG的功能是在web.config里的debug=false的时候才去空格,这样可以在开发环境看到正常的代码。

但是处理的页面多了以后发现正则不那么好处理,因为html中代码注释的情况很多有的如下

<script>
<!--
或
<!--[if IE 6]><script type="text/javascript">document.execCommand("BackgroundImageCache", false, true);</script><![endif]-->

这些格式的代码也会被错误的过滤掉。于是发现了google code上有一个叫htmlcompressor开源项目,非常好用项目地址:https://code.google.com/p/htmlcompressor/,遗憾的是没有c#版本,只支持php和java,只好自己改了一个。用法如下:

HtmlCompressor compressor = new HtmlCompressor();
      compressor_html = compressor.compress(html);

是不是很方便呀,还有很多高级选项可以设定呢。详细用法请在官网查看吧!

分类
Web编程 编程开发

web.config SessionState配置详解

2个.net应用部署在windows 2003 server服务器iis下面的9005端口下.使用各自独立的application pool,其<sessionState/>配置节配置为相同的

<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20"/>

,windows 2003 server的asp.net state service服务已启动,运行稳定.
1.如果发生”Unable to serialize the session state. In ‘StateServer’ and ‘SQLServer’ mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in ‘Custom’ mode(无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。)”异常,请检查Session中存储的自定义对象是否都已进行[Serializable]标识;
2.如果发生”[0]Session中UserInfo为空”异常,请检查<sessionState/>配置节是否已在web.config中启用;
3.如果发生SessionState冲突异常,请检查2个应用的<sessionState/>配置节是否都配置为mode=”InProc”;
.NET Framework 常规参考
<sessionState> 元素
为当前应用程序配置会话状态设置。

<configuration> 
  <system.web> 
  <sessionState> 
  <sessionState mode="Off|InProc|StateServer|SQLServer" 
  cookieless="true|false" 
  timeout="number of minutes" 
  stateConnectionString="tcpip=server:port" 
  sqlConnectionString="sql connection string" 
  stateNetworkTimeout="number of seconds"/>

必选属性
属性 选项 说明
mode 指定在哪里存储会话状态。
Off 指示会话状态未启用。
InProc 指示在本地存储会话状态。
StateServer 指示在远程计算机上存储会话状态。
SQLServer 指示在 SQL Server 上存储会话状态。
可选属性
属性 选项 说明
cookieless 指定不具有 Cookie 的会话是否应用于标识客户端会话。
true 指示应使用不具有 Cookie 的会话。
false 指示不应使用没有 Cookie 的会话。默认值为 false。
timeout 指定在放弃一个会话前该会话可以处于空闲状态的分钟数。默认值为 20。
stateConnectionString 指定远程存储会话状态的服务器名称和端口。例如“tcpip=127.0.0.1:42424”。当 mode 为 StateServer 时该属性是必需的。
sqlConnectionString 为 SQL Server 指定连接字符串。例如“data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind”。当 mode 为 SQLServer 时该属性是必需的。
stateNetworkTimeout 在使用 StateServer 模式存储会话状态时,指定在放弃会话之前 Web 服务器和状态服务器之间的 TCP/IP 网络连接空闲的时间(以秒为单位)。默认值为 10。

分类
Web编程 编程开发

asp.net使用后台代码做301重定向

尽管目前IIS7以上推出了微软官方的UrlRewrit模块,但是该模块也仅仅只支持http_post等类似的参数,如果需要查询数据库作为条件判断是不可能实现的。

当然,这种情况我们可以想一个变通的方式来进行,利用iis的重写到一个aspx页面,然后在该页面的代码里面进行查询数据库做条件重定向操作。

在。net 2.0下面

Response.StatusCode = 301;
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", "重定向的网址");

在。net 4.0以上更方便了

Response.RedirectPermanent("地址")

就可以了。

同理,如果希望代码返回http404状态

Response.Status = "404 Not Found";
Response.StatusCode = 404;
分类
Web编程 编程开发

C# Ajax异步请求阻塞情况的解决办法

最近使用ExtJs4的mvc模式在开发了后台,因为异步请求比较多,有的回应时间长,有点短。我发现在多次并发的情况下,会造成阻塞的情况。也就是说如果回应时间长的请求还在进行中,短的请求却被挂起。

找了很多资料,最终确定是asp.net session造成的。好像php也存在此类问题。

现象:在一个网站中,当访问一个处理比较耗时的页面(A页面),页面请求还没有返回时,此时再点击访问该网站的其他页面(B页面)会出现B页面很久都没有响应和返回,直到A页面输出返回数据时才开始处理B页面的请求,造成请求排队处理,A页面阻塞了B页面的请求处理。

 

在一次的无意中我发现竟然在A页面Loading(页面上加的提示)的时候,可以访问某个页面,真是惊喜,再试试几次,可以,确实可以,是不是页面代码阻塞了?于是查这两个页面的代码,其实这两个页面的代码就十几行,没什么问题呢。

 

经过多次尝试和比对,才发现这两个页都是无需登陆验证的页面,之前出现阻塞的页面都是需登陆验证后才可访问的页面,而系统的验证信息是存储在Session中,通过Session判断验证的。这时想到应该是Session的问题,但还是不知如何处理,再去网上搜索,互联网上的信息真是应有尽有,终于搜索到问题所在:

/************************************************************/

问:为了可以顺序访问Session的状态值,Session是否提供了锁定机制?
答:Session实现了Reader/Writer的锁机制:
当页面对Session具有可写功能(即页面有<%@ Page EnableSessionState=”True” %>标记),此时直到请求完成该页面的Session持有一个写锁定。
当页面对Session具有只读功能(即页面有<%@ Page EnableSessionState=”ReadOnly” %>标记),此时知道请求完成该页面的Session持有一个读锁定。
读锁定将阻塞一个写锁定;读锁定不会阻塞读锁定;写锁定将阻塞所有的读写锁定。这就是为什么两个框架中的同一个页面都去写同一个Session时,其中一个要等待另一个(稍快的那个)完成后,才开始写。

“写锁定将阻塞所有的读写锁定”,也就是说页面在EnableSessionState=”True”的情况下没返回输出时,一直持着Session写操作,其他页面对Session的读操作必须等待,而asp.net的aspx页面默认是EnableSessionState=”True”,每个页面从请求开始至返回一直持着Session写操作,需验证页面必须读取Session值判断,这就是为什么需验证的页面请求被阻塞的原因。只要耗时页面(A页面)没有Session的写操作,也就不会阻塞其他页面的请求,于是修改A页面的EnableSessionState=”ReadOnly”,例如:<%@ Page Language=”C#” AutoEventWireup=”true” CodeFile=”TBS_Monitor_List.aspx.cs” EnableSessionState=”ReadOnly”  Inherits=”TBS_Monitor_List” %> ,问题解决。

也就是说,在无需对session进行写操作的页面,加上EnableSessionState=”ReadOnly” 属性,就不会造成Request阻塞的情况了。

分类
Web编程 编程开发

Asp.Net 在ashx文件中 Session 为 null

今天在做登录验证码的时候发现code.ashx中无法设置session,错误信息为context.Session是空值。报错代码如下:

public void ProcessRequest (HttpContext context) {
        context.Session["VariableName"] = Id;
    }

后来在国外网站找到解决办法
原帖地址:http://stackoverflow.com/questions/2156524/asp-net-session-is-null-in-ashx-file

原来,需要实现IRequiresSessionState或IReadOnlySessionState二选一,前者提供了完整的会话访问,而后者提供的只读访问权限。只需要引用他们即可 代码如下:

public class code : IHttpHandler, IRequiresSessionState
分类
编程开发

.net System.Web.Caching.Cache缓存类使用详解

System.Web.Caching 命名空间提供用于缓存服务器上常用数据的类。这包括 Cache 类,该类是一个使您可以存储任意数据对象(如哈希表和数据集)的词典。它还为这些对象提供到期功能,并提供使您可以添加和移除对象的方法。您还可以添加依赖于其他文件或缓存项的对象,并在从 Cache 中移除对象时执行回调以通知应用程序。

System.Web.Caching.Cache 用于实现 Web 应用程序的缓存。

对于每个应用程序域均创建该类的一个实例,并且只要对应的应用程序域保持活动,该实例便保持有效。有关此类实例的信息通过 HttpContext 对象的 Cache 属性或 Page 对象的 Cache 属性来提供。

方法:

Add
将指定项添加到 Cache 对象,该对象具有依赖项、过期和优先级策略以及一个委托(可用于在从 Cache 移除插入项时通知应用程序)。如果 Cache 中已保存了具有相同 key 参数的项,则对此方法的调用将失败。若要使用相同的 key 参数改写现有的 Cache 项,请使用 Insert 方法.

Insert
向 Cache 对象插入项。使用此方法的某一版本改写具有相同 key 参数的现有 Cache 项。

Remove
从应用程序的 Cache 对象移除指定项。

Item / Get

提供通过Name找到Value的方法

———————————————————————————————————————————————–

一下是从微软网上MSDN找到的一篇有关Cache的说明, 内容差不多,但是要更加具体一些:

您可以使用三种不同的技术将项添加到 Cache 对象中。根据应用程序要求的不同,您的选择可以从简单到复杂。

如果要利用 Cache 所提供的清理、到期时间和依赖项支持,则必须使用 Cache.Insert 方法或 Cache.Add 方法。

注意 Add 和 Insert 方法具有相同的签名,但它们之间存在细微的差别。首先,调用 Add 方法返回表示缓存项的对象,而调用 Insert 方法不是。其次,如果您调用这些方法并将已存储在 Cache 中的某个项添加到 Cache 中,那么它们的行为是不同的。Insert 方法替换该项,而 Add 方法失败。
通过指定其键和值将项添加到缓存中

通过指定项的键和值,您可以像将项添加到字典中一样将其添加到缓存中。下面的代码将文本框的当前 Value 属性添加到 Cache 中。
[Visual Basic]
Cache(“txt1”) = txtName.value
[C#]
Cache[“txt1”] = txtName.value;
通过使用 Insert 方法将项添加到缓存中

重载 Insert 方法,允许您定义正在使用的版本的参数的值。例如,若要只添加项的键和值,则使用下面的代码。
[Visual Basic]
Cache.Insert(“MyData1”, connectionString)
[C#]
Cache.Insert(“MyData1”, connectionString);
使用 Add 方法将项添加到缓存中

Add 方法与 Insert 方法具有相同的签名,但它返回表示您所添加项的对象。
[Visual Basic]
Cache.Add(“MyData1”, connectionString)
[C#]
Cache.Add(“MyData1”, connectionString);
这两种方法都使您能够在很大程度上控制在 Cache 中保留项的条件。两种方法都支持使缓存的项依赖于外部文件或目录、Cache 中的其他键或任意一个的数组。将设有依赖项的项添加到 Cache 中将创建 CacheDependency 类的实例,它跟踪对您定义的依赖项的更改。如果这些依赖项的任何一个发生更改(包括被删除或移动),则将与该依赖项关联的项从 Cache 中移除。

将设有依赖项的项添加到缓存中

您可以使用 Add 或 Insert 方法中的 dependencies 参数将设有依赖项的项添加到 Cache 中。下面的示例演示使用 Insert 方法将设有依赖项(在 XML 文件上)的项添加到 Cache 中。
[C#]
Cache.Insert(“MyData1”, connectionString, new CacheDependency(Server.MapPath(//myServer/myConfig.xml)));
[Visual Basic]
Cache.Insert(“MyData1”, connectionString, new CacheDependency(Server.MapPath(//myServer/myConfig.xml)))
将设有到期策略的项添加到缓存中

您可以使用 absoluteExpiration parameter 参数和 slidingExpiration 参数将设有到期策略的项添加到 Cache 中。您可以定义绝对过期时间或弹性过期时间,但不能同时定义两者。在使用上述参数之一定义到期策略时,必须将另一个参数设置为零。Cache 类定义了两个自动执行该操作的字段:NoAbsoluteExpiration 和 NoSlidingExpiration。当定义绝对或弹性过期时间时,只要将适当的参数设置为其相应的字段值即可。下面的示例使用 Insert 方法将设有两分钟绝对到期时间的项添加到 Cache 中。
[C#]
Cache.Insert(“MyData1”, connectionString, null, DateTime.Now.AddMinutes(2), NoSlidingExpiration);
[Visual Basic]
Cache.Insert(“MyData1”, connectionString, null, DateTime.Now.AddMinutes(2), NoSlidingExpiration)
下面的代码使用 Insert 方法将设有 30 秒弹性过期时间的项添加到 Cache 中。

[C#]
Cache.Insert(“MyData1”, connectionString, null, NoAbsoluteExpiration, TimeSpan.FromSeconds(30));
[Visual Basic]
Cache.Insert(“MyData1”, connectionString, null, NoAbsoluteExpiration, TimeSpan.FromSeconds(30))
注意 当设置绝对到期时间时,请使用 DateTime 结构。当设置弹性过期时间时,请使用 TimeSpan 结构。另外,如果您创建的弹性过期时间小于零或大于一年,则将引发 ArgumentOutOfRangeException 类。
您还可以使用 Add 或 Insert 方法通过在 CacheItemPriority 枚举中指定值定义缓存项的相对重要性。当 Web 服务器进行清理以释放内存时,这些相对优先级会对它有所帮助。Web 服务器会在移除具有较高优先级的项之前先从 Cache 中移除具有较低优先级的项。

将设有优先级设置的项添加到缓存中

您可以通过在 Add 或 Insert 方法上使用 priority 参数将设有优先级设置的项添加到 Cache 中。下面的示例使用 Add 方法将 priority 为 High 的项添加到 Cache 中。
[C#]
Cache.Add(“MyData1”, connectionString, null, NoAbsoluteExpiration, TimeSpan.FromSeconds(30), CacheItemPriority.High, null);
[Visual Basic]
Cache.Add(“MyData1”, connectionString, null, NoAbsoluteExpiration, TimeSpan.FromSeconds(30), CacheItemPriority.High, null)
这些方法还允许在项从缓存中移除时,使用 CacheItemRemovedCallback 委托通知应用程序。有关完整的示例,请参见从缓存中删除项时通知应用程序。

分类
网络服务

windows主机IIS7下 web.config设置301重定向

 

linxu下配置301重定向非常简单,配置下.htaccess文件即可,很多主机面板还有图形化界面,比如cp面板。

iis7利用web.config配置起来相对麻烦点,发出来备忘

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>

        <rule name="www redirect" stopProcessing="true">
              <match url=".*" />
                 <conditions>
     <add input="{HTTP_HOST}" pattern="^zhaojiyu.com$" />
                 </conditions>
              <action type="Redirect" url="http://www.zhaojiyu.com/{R:0}"
                   redirectType="Permanent" />
          </rule>
    </rules>
    </rewrite>
  </system.webServer>
</configuration>

 

作用:把 不带www的 永久定向到 www.上

好处:权重集中,免遭搜索引擎惩罚。

分类
软件应用

IIS7.5 web.config Rewrite Rules 防盗链

 

在web.config中加入rewrite规则

格式如下:

<system.webServer>
		 <security>
		  <requestFiltering allowDoubleEscaping="true"></requestFiltering>      
		</security>
        <directoryBrowse enabled="false" />
        <defaultDocument>
            <files>
                <clear />
                <add value="index.htm" />
                <add value="index.html" />
                <add value="iisstart.htm" />
            </files>
        </defaultDocument>
		<rewrite>
			<rules>
				<rule name="Forbid image">
				<match url="^.*comicdata.*.(txt|doc|gif|jpg|jpeg|png|mp3|flv|swf)$" ignoreCase="true" />
				<conditions>
				<add input="{HTTP_REFERER}" pattern="^http://(www.)?yzmanga.com/.*$" negate="true" />
				<add input="{REMOTE_ADDR}" pattern="221.232.16.*" negate="true" />
				</conditions>
				<action type="Rewrite" url="/static/image/common/logo.png" />
				</rule>
			</rules>
		</rewrite>
    </system.webServer>

IIS Express命令行使用方法

使用方式:





iisexpress [/config:config-file] [/site:site-name] [/systray:boolean]





iisexpress /path:app-path [/port:port-number] [/clr:clr-version] [/systray:boolean]





/config:config-file





applicationhost.config文件的全路径。默认值是位于用户的Documents目录下的IISExpress8\config\applicationhost.config文件。





/site:site-name





要加载的站点名,在applicationhost.config文件中声明。





/path:app-path





待运行应用的完整物理路径。该选项不能与/config等相关选项一起使用。





/port:port-number





应用绑定的端口号。默认值是8080,还需要指定/path选项。





/clr:clr-version





运行应用的.NET Framework版本号(比如v2.0)。默认值是v4.0,还需要指定/path选项。





/systray:boolean





启用或禁用系统托盘应用,默认值是true。





示例:





iisexpress /site:WebSite1





该命令会运行用户配置文件中的WebSite1站点。





iisexpress /config:c:\myconfig\applicationhost.config





该命令会运行指定配置文件中的第一个站点。





iisexpress /path:c:\myapp\ /port:80 





该命令会运行c:\myapp目录中的站点,端口号是80。