Windows 2008 IIS7部署WebAPI的坑

只要用Windows 2008 32位系统,你总会遇到这个坑。先说一下解决办法吧:

1、Application Pool 应用程序池只能用经典模式,至于为什么不能用集成模式,微软是这么说的:http://www.asp.net/mvc/overview/older-versions-1/deployment/using-asp-net-mvc-with-different-versions-of-iis-cs

2、Handler Mapping添加一个映射WebApi(名字随便起):* 指向到C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll,为啥呢,因为默认的StaticFile已经把*的解析接管了。

至此,WebApi作为后端业务,前端Winform、WebForm、MVC还有手机端都已经实战过了,的确很方便。

特别对于Winform的,不用担心直连数据库时,因为网络不稳定,一次客户操作多次数据库操作时的数据丢失、不完整、丢失等问题了。

Loading

微软序列化时出现k_BackingField怎么处理

当你用微软自带的System.Runtime.Serialization序列化类时,如果出现了json字段中有k_BackingField前缀,请不要见外,因为你没有设置好DataContract和DataMember属性,如果你想继续使用[Serializable],你也可以通过设置Global.asax进行全局设置。

在Application_Start()中加入下面一行代码: GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new DefaultContractResolver { IgnoreSerializableAttribute = true };

Loading

C#中const与readonly区别

近期将旺财代码生成器的Entity代码进行优化,表名和字段名

一句话:const的值是固定的,代码里面写死的,每一次编译后结果都一样,而readonly的值是可以在运行的时候才确定值的。

了解更多:所谓静态常量就是在编译期间会对变量进行解析,再将常量的值替换成初始化的值;所谓动态常量就是编译期间会将变量标记只读常量,而不用常量的值代替,这样在声明时可以不初始化,可以延迟到构造函数初始化。

有关内存:const修饰的常量没有内存消耗;readonly因为需要保存常量,所以有内存消耗。

Loading

C# .Net中获取Windows AD域用户缺失的故障解决

因为公司的OA系统使用的Windows域账号集成认证,近期新来的同事账号却没能自动导入账号到OA系统,花了快一天时间发现并解决了问题。

Windows AD域用户清单获取不全,原来这里的写法有问题:ds.Filter = “(objectClass=user)”改为ds.Filter = “(&(objectClass=user))”

尽管问题很简单,但因此收获了一篇很全面的关于在C#中访问活动域的技术文章,原文地址:Howto: (Almost) Everything In Active Directory via C#

Loading

好文分享:ASP.NET WebForm设计思路的思考

博客园的荆棘人写了篇关于WebForm的文字,要知道这么古老的技术已经很好有人提及:https://www.cnblogs.com/Tpf386/p/9588243.html

更可怕的消息是,对于我这样的ASP时代的高手,肯定没有错过WebForm。是的我一直在用,不过更多的是用html+js+ashx+WebForm,只是轻量的用到WebForm的一些控件如:GridView和Repeater。

当然了,我们都要往前走,跳过MVC 3、4、5,直接玩.NET Core MVC是更好的选择。

 

Loading

Max length of Excel cell contents(text) is 32767 characters

NPOI是.NET平台下的常用的Excel的导入和导出组件,不过近期用户说导出的报表数据丢掉,换行错误等,花了N个小时,才发现根本原因:其中有几个字段在数据库中的长度超过了32767,但Excel却不能将这么长的字符放在一个单元格,因为Excel的一个单元格只支持32767的长度。

Loading

八元素 Tuple 的最后一个元素必须为 Tuple。

标题是来自C#中的一个程序报错提示,让我困惑的是定义元组Tuple时,超过8个,就算不为第8个成员创建新的Tuple,编译阶段并不报错,但执行时报错。

趟过了这个坑,再来回顾一下元组:元组就是一些对象的集合,在我们编程时,比如一个人的信息,我们常常创建一个Person类去描述一个人,传统的做法如下:

public class Person{
public int ID{get;set;}
public string Name{get;set;}
}

Person p=new Person(){Id=1,Name=’Troy’};
Console.WriteLine(p.Name);

那么我们使用元组可以怎么做呢?如下所示

//直接使用元组对象,不需要创建自定义的对象
Tuple<int,string> p=new Tuple<int,string>(1,’Troy’);

//Item1 代表第一个,Item2代表第二个,每一个元组对象都有一个默认的item属性Console.WriteLine(p.Item2);

由此可见,元组一个很方便的用途就是不用为了一些简单的结构或对象而去新建一个类了。
需要特别注意的是Tuple最多支持8个成员,如果成员超过了8个我们必须将第8个成员当成一个元组,通过元祖的嵌套去完成。

举例:Tuple<string, int, int, int, int, int, int, Tuple<string, int, int>>

红色部分是第8个,这里的第8个成员又是一个元组。

Loading

C#开发中Windows域认证登录2(扩展吉日嘎拉GPM系统)

上午写了一篇《C#开发中Windows域认证登录》,然后跟吉日嘎拉沟通了一下,还是把这个Windows AD用户登录的功能扩展到DotNet.Business中,重新命名为LDAP方式的登录,因为需要引用System.DirectoryServices,暂时用不到此功能的朋友,可以exclude此文件(DotNet.Business\WebUtilities\Utilities.LogOnLDAP.cs)。

<br/>//-----------------------------------------------------------------<br/>// All Rights Reserved , Copyright (C) 2013 , Hairihan TECH, Ltd .<br/>//-----------------------------------------------------------------<br/><br/>using System;<br/>using System.Collections.Generic;<br/>using System.Configuration;<br/>using System.Data;<br/>using System.Text;<br/>using System.Web;<br/>using System.Web.Caching;<br/>using System.Web.Security;<br/>using System.DirectoryServices;<br/>using DotNet.Utilities;<br/><br/>namespace DotNet.Business<br/>{<br/>    /// <summary><br/>    /// LDAP登录功能相关部分<br/>    /// </summary><br/>    public partial class Utilities<br/>    {<br/>        // LDAP域用户登录部分:包括Windows AD域用户登录<br/>        #region public static BaseUserInfo LogOnByLDAP(string domain, string lDAP, string userName, string password, string permissionCode, bool persistCookie, bool formsAuthentication, out string statusCode, out string statusMessage)<br/>        /// <summary><br/>        /// 验证LDAP用户<br/>        /// </summary><br/>        /// <param name="domain">域</param><br/>        /// <param name="lDAP">LDAP</param><br/>        /// <param name="userName">域用户名</param><br/>        /// <param name="password">域密码</param><br/>        /// <param name="permissionCode">权限编号</param><br/>        /// <param name="persistCookie">是否保存密码</param><br/>        /// <param name="formsAuthentication">表单验证,是否需要重定位</param><br/>        /// <param name="statusCode"></param><br/>        /// <param name="statusMessage"></param><br/>        /// <returns></returns><br/>        public static BaseUserInfo LogOnByLDAP(string domain, string lDAP, string userName, string password, string permissionCode, bool persistCookie, bool formsAuthentication, out string statusCode, out string statusMessage)<br/>        {<br/>            DirectoryEntry dirEntry = new DirectoryEntry();<br/>            dirEntry.Path = lDAP;<br/>            dirEntry.Username = domain + "\\" + userName;<br/>            dirEntry.Password = password;<br/>            dirEntry.AuthenticationType = AuthenticationTypes.Secure;<br/><br/>            try<br/>            {<br/>                DirectorySearcher dirSearcher = new DirectorySearcher(dirEntry);<br/>                dirSearcher.Filter = String.Format("(&(objectClass=user)(samAccountName={0}))", userName);<br/>                System.DirectoryServices.SearchResult result = dirSearcher.FindOne();<br/>                if (result != null)<br/>                {<br/>                    // 统一的登录服务<br/>                    DotNetService dotNetService = new DotNetService();<br/>                    BaseUserInfo userInfo = dotNetService.LogOnService.LogOnByUserName(Utilities.GetUserInfo(), userName, out statusCode, out statusMessage);<br/>                    // 检查身份<br/>                    if (statusCode.Equals(Status.OK.ToString()))<br/>                    {<br/>                        userInfo.IPAddress = GetIPAddressId();<br/><br/>                        bool isAuthorized = true;<br/>                        // 用户是否有哪个相应的权限<br/>                        if (!string.IsNullOrEmpty(permissionCode))<br/>                        {<br/>                            isAuthorized = dotNetService.PermissionService.IsAuthorized(user
Info, permissionCode, null);<br/>                        }<br/>                        // 有相应的权限才可以登录<br/>                        if (isAuthorized)<br/>                        {<br/>                            if (persistCookie)<br/>                            {<br/>                                // 相对安全的方式保存登录状态<br/>                                // SaveCookie(userName, password);<br/>                                // 内部单点登录方式<br/>                                SaveCookie(userInfo);<br/>                            }<br/>                            else<br/>                            {<br/>                                RemoveUserCookie();<br/>                            }<br/>                            LogOn(userInfo, formsAuthentication);<br/>                        }<br/>                        else<br/>                        {<br/>                            statusCode = Status.LogOnDeny.ToString();<br/>                            statusMessage = "访问被拒绝、您的账户没有后台管理访问权限。";<br/>                        }<br/>                    }<br/><br/>                    return userInfo;<br/>                }<br/>                else<br/>                {<br/>                    statusCode = Status.LogOnDeny.ToString();<br/>                    statusMessage = "应用系统用户不存在,请联系管理员。";<br/>                    return null;<br/>                }<br/>            }<br/>            catch (Exception e)<br/>            {<br/>                //Logon failure: unknown user name or bad password.<br/>                statusCode = Status.LogOnDeny.ToString();<br/>                statusMessage = "域服务器返回信息" + e.Message.Replace("\r\n", "");<br/>                return null;<br/>            }<br/><br/>            <br/>        }<br/>        #endregion<br/><br/>    }<br/>}<br/>

前端的登录文件-SigninLDAP.aspx,代码较多可参考Signin.aspx。

Loading