如果在为方法声明参数时未使用 ref 或 out,则该参数可以具有关联的值。可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值。通过使用方法参数关键字,可以更改这种行为。
来自 <http://www.cnblogs.com/hunts/archive/2007/01/13/619620.html>
C#中() =>是lambda表达式,表示一个匿名函数,=>前面的是参数,后面的是函数体。
可以把它当作一个函数。
举例:
Func<int, int, int> Add = (x, y) => x + y;
Console.WriteLine(Add(2, 3)); // 5
Server.HtmlEncode 顾名思义 html编码
Server.HtmlDecode 顾名思义 html反编码
1)保存数据库之前就进行HTML编码(Server.HtmlEncode),读取显示时直接输出
2)保存数据库之前未进行HTML编码,读取显示前(Server.HtmlEncode)
C#中<summary>的用途
在一个类,方法或属性定义的上一行输入///就会出现<summary>. 调用这个类或方法时写在<summary>里的东西就会以提示的方式出现..
例如: /// <summary>
/// 功能:完成消费交易的撤销,其处理流程是根据原交易终端流水号,找到原交易,并把该交易撤销,系统只支持当日撤销。
/// </summary>
/// <param name="p_Track2">2磁道信息,37bytes,右补空格</param>
/// <param name="Track3">3磁道信息,104bytes,右补空格</param>
/// <param name="Amount">原交易金额,单位:分</param>
/// <param name="termstan">原交易终端流水号,6bytes</param>
/// <param name="OperNo">操作员号,不定长</param>
/// <param name="bitmap58">保留参数1,不定长</param>
/// <param name="bitmap59">保留参数2,不定长</param>
/// <returns></returns>
[DllImport(@"C:WINDOWSicbcMposCore.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
public static extern string DoRefund(StringBuilder p_Track2, StringBuilder Track3, int Amount, StringBuilder termstan, StringBuilder OperNo, StringBuilder bitmap58, StringBuilder bitmap59);
5.HTTP GET
POST
public Response Invoke(Request request, string body)
{
var httpResponse = string.Empty;
var url = request.GenerateUrl(BaseUrl);
log.Info("RequestUrl: " + url);
try
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.Method = "POST";
httpWebRequest.ContentType = "application/json";
httpWebRequest.Accept = "*/*";
httpWebRequest.Connection = "Keep-Alive";
httpWebRequest.KeepAlive = true;
httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)";
httpWebRequest.Timeout = 15000;
byte[] btBodys = Encoding.UTF8.GetBytes(body);
httpWebRequest.ContentLength = btBodys.Length;
httpWebRequest.GetRequestStream().Write(btBodys, 0, btBodys.Length);
using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
{
using (var streamReader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.UTF8))
{
httpResponse = streamReader.ReadToEnd();
}
httpWebRequest.Abort();
httpWebResponse.Close();
}
log.Info("ResponseRaw: " + httpResponse);
}
catch (Exception e)
{
log.ErrorFormat("调用WebApi失败,{0},url:{1}", e.Message, url);
return Response.NoResponse;
}
var response = new Response(request.Method, httpResponse);
log.Debug("ResponseContent: " + response.reBased);
return response;
}
介绍 日志 概念
• 日志是一种 调试 和 追踪 手段. (调试手段还有 断点,单步执行,断言,内存快照,alert 等)
• 日志的优点: 无须人工干预,能长期记录,对程序的侵入性小,能灵活配置
• log4net 的配置和使用:
1. 引用log4net.dll
2. 添加 log4net 配置
3. 在程序开始的地方启动配置 log4net.Config.XmlConfigurator.Configure();
4. 在需要添加日志功能的类加上log字段 private static readonly log4net.ILog log = log4net.LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
1.引用log4net.dll
2/添加log4net配置
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<appSettings>
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
<log4net>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" />
</layout>
</appender>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="logslog.txt" />
<appendToFile value="true" />
<maxSizeRollBackups value="50" />
<maximumFileSize value="1MB" />
<rollingStyle value="Size" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<header value="[Header] " />
<footer value="[Footer] " />
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
</layout>
</appender>
<root>
<level value="DEBUG" /> ----------------------------------默认为DEBUG(对应用法log.DEBUG/log.ERROR等)
<appender-ref ref="RollingLogFileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
</log4net>
</configuration>
3/在程序开始的地方启动配置
namespace ServiceSelf
{
public partial class frmMain : FormBase
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public frmMain()
{
log4net.Config.XmlConfigurator.Configure();
log.Debug("程序启动");
4/在需要添加日志功能的类加上log字段
public class BankCard : GLib.IBankCardPayfor
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public string ProviderName
{
get { return "银联卡"; }
}
private bool m_Inited = false;
public bool Init()
{
try
{
//初始化读卡器
int i_appType = 1;//01
int nResult = API.UMS_Init(i_appType);
log.Debug("银联卡收银初始化");
if (nResult != 0)
{
FrontEnd.SaveLog("银联卡收银", "API.UMS_Init返回值:" + nResult.ToString());
log.Debug("初始化UMS_Init返回值:" + nResult.ToString());
return false;
}
C#中的Action<>和Func<>
http://blog.csdn.net/jcx5083761/article/details/8552627
来自 <http://blog.csdn.net/leapenemc0907/article/details/6067243>
管理员身份运行CMD
"C:Program Files (x86)Microsoft SDKsWindowsv7.0AinWSDL" /l:CS /n:Dadi.Service.SmClients /o:ErbanSmProxy.cs "http://sms.2office.net/WebService/services/SmsService?wsdl"
wsdl /l:CS /n:InsuranceLib /o:EcooperationWebServiceService.cs http://test.mypicc.com.cn/ecooperation/webservice/insure?wsdl
wsdl /l:CS /n:F2FPay /o:FrontAlipayService.cs http://localhost:8081/FrontAlipayService.asmx
常用的调用WebService的方法有哪些?
答:1.使用WSDL.exe命令行工具。
2.使用VS.NET中的Add Web Reference菜单选项
来自 http://www.cnblogs.com/fan0136/archive/2009/09/21/1571238.html
Fiddle
在会话列表中默认的文本的颜色从HTTP的响应的状态继承而来(红色代表错误,黄色代表需要授权)CONNECT类型为灰色, 还有返回类型(CSS文件为紫色,HTML文件为蓝色,JS脚本为绿色,图片为灰色)你可以通过使用ui-color 标志位来改变和重写列表的默认颜色。 (提示:ui-color在Fiddler的脚本配置文件中,需要安装FiddlerScript) |
来自 <http://www.cnblogs.com/kingwolf_JavaScript/archive/2012/11/07/FiddlerUI.html>
DllImport
/// <summary>
/// 初始化密码键盘,检查冲正
/// </summary>
/// <param name="appType">应用类型 1:传统银行卡应用2:全民付应用3:预付卡</param>
/// <returns></returns>
[DllImport("\umsips\umsapi.dll")]
public static extern int UMS_Init(int appType);
/// <summary>
/// 初始化密码键盘,检查冲正
/// </summary>
/// <param name="appType">应用类型 1:传统银行卡应用2:全民付应用3:预付卡</param>
/// <returns></returns>
[DllImport(@"C:umsipsumsapi.dll")]
public static extern int UMS_Init(int appType);
#region 创自读卡器API
/// <summary>
/// 打开串口
/// </summary>
/// <param name="port">串口号</param>
/// <returns>0:成功 2:串口已打开 其它:失败</returns>
[DllImport("CRT310.dll")]
public static extern int OpenDevice(int port);
app.config 文件:
它是标准的 XML 格式文件, Settings.settings 所设置的所有属性,都在 app.config 有所体现,也就是你可以通过配置到 app.config 文件中写入你想要的
来自 <http://blog.sina.com.cn/s/blog_6e5c92860100mnm6.html>
Program.cs文件:
整个应用程序的入口,Application.Run(new main.main());语句标记了你启动的窗口,你可以通过改变参数来设置你的启示界面。
来自 <http://blog.sina.com.cn/s/blog_6e5c92860100mnm6.html>
Failed to access IIS metabase解决方案:
原因:IIS没有注册
解决办法:在CMD中进入目录C:WINDOWSMicrosoft.NETFrameworkv2.0.50727,运行aspnet_regiis
1、aspnet_regiis -ga administrator(administrator为当前用户)
C:Documents and SettingsAdministrator>cd c:\windows\microsoft.net\framework\v2.0.50727
2、aspnet_regiis -i (注册IIS)
来自 <http://www.cnblogs.com/skylaugh/archive/2011/06/22/2086759.html>
raiserror 是用于抛出一个错误
来自 <http://www.cnblogs.com/xugang/archive/2011/04/09/2010216.html>
-- =============================================
-- Description: 一证一票实名制购票时,是否重复
-- =============================================
CREATE PROCEDURE self_IsSameOfRealNameSchem
@StationNo INT, --隶属站编号
@DriveDate DATETIME, --发车日期
@SchemNo INT, --车次号
@IDCardNoList NVARCHAR(MAX),--证件号码列表,中间用半角逗号分开
@TicketNum INT --购票数量
AS
BEGIN
SET NOCOUNT ON;
--查询班次信息
DECLARE @TagStr NVARCHAR(50),@RealNameNeed BIT
SELECT @TagStr=识别号,@RealNameNeed=售票实名制
FROM dbo.可售班次 WITH(NOLOCK)
WHERE 发车日期=@DriveDate AND 隶属站编号=@StationNo AND 车次号=@SchemNo
IF @TagStr IS NULL
BEGIN
RAISERROR('查询班次信息失败',16,1)
RETURN 1
END
IF @RealNameNeed=0--不要求实名制直接返回
RETURN 0
DECLARE @Error NVARCHAR(4000),@InputNum INT
SELECT 子串 INTO #IDCardNoList
FROM dbo.SpitStringToTable(@IDCardNoList,',')
SELECT @InputNum=@@ROWCOUNT
IF dbo.GetPublicSetInfo('实名制购票一票一证','0')='1' AND @InputNum<@TicketNum
BEGIN
RAISERROR('证件数量不得少于购票数量',16,1)
RETURN 1
END
--检查有没有重复的
SELECT 子串,COUNT(*) AS 数量
INTO #OnlyOne
FROM #IDCardNoList
GROUP BY 子串
SELECT @Error=''
SELECT @Error=@Error+子串
FROM #OnlyOne
WHERE 数量>1
IF LEN(@Error)>1
BEGIN
SELECT @Error='传入的证件号参数重复:'+@Error
RAISERROR(@Error,16,1)
RETURN 1
end
if dbo.GetPublicSetInfo('同证件号实名制售票','1')='0'
BEGIN
SELECT @Error=''
SELECT DISTINCT @Error=@Error+证件号码+','
FROM #IDCardNoList A INNER JOIN dbo.售票记录 B WITH(NOLOCK)
ON B.班次识别号=@TagStr AND A.子串=B.证件号码 AND B.当前状态='已售'
IF LEN(@Error)>1
BEGIN
SELECT @Error='下列证件号已有同班次售票记录:'+@Error
RAISERROR(@Error,16,1)
RETURN 1
end
END
END
GO
public static bool ExecSql(string p_strSql, string p_ConnectString, SqlParaValueInfo[] p_Paras)
{
ClearErrors();
bool bResult = false;
using (SqlConnection connection = new SqlConnection(p_ConnectString))
{
try
{
connection.Open();
using (SqlCommand command = new SqlCommand(p_strSql, connection))
{
foreach (SqlParameter para in GetSqlParams(p_Paras))
command.Parameters.Add(para);
command.CommandTimeout = DB.TimeOutTime;
command.ExecuteNonQuery();
bResult = true;
}
}
catch (Exception ee)
{
m_ErrMsg = ee.Message;
WriteSqlError(p_strSql, ee.Message);
}
finally
{
connection.Close();
}
}
return bResult;
}
EXEC [dbo].[self_IsSameOfRealNameSchem]
@StationNo=9992,
@DriveDate='2016-07-07',
@SchemNo=7613,
@IDCardNoList=130423198906274027,
@TicketNum=1
65 (self_IsSameOfRealNameSchem) 下列证件号已有同班次售票记录:130423198906274027, Severity 16
EXEC [dbo].[self_IsSameOfRealNameSchem]
@StationNo=9992,
@DriveDate='2016-07-07',
@SchemNo=5328,
@IDCardNoList=',42098419810607101X',
@TicketNum=1
异步
control.begininvoke(参数delegate)方法:在创建控件的基础句柄所在线程上异步执行指定委托。
invoke(同步)和begininvoke(异步)的概念,其实它们所说的意思是相对于子线程而言的,其实对于控件的调用总是由主线程来执行的
来自 <http://blog.csdn.net/thebesttome/article/details/7589856>
Web API来管理联系人
说明:为了方便数据不使用真正的数据库,而是通过内存数据模拟
来自 <http://www.cnblogs.com/qingyuan/archive/2012/10/16/2725378.html>
来自 <http://blog.csdn.net/hdhai9451/article/details/12129579>
public static string ObjectToXml(object obj, bool toBeIndented, Type type)
{
if (obj == null)
{
throw new ArgumentNullException("obj");
}
//Create our own namespaces for the output
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
//Add an empty namespace and empty value
ns.Add("", "");
Encoding gb2312 = Encoding.GetEncoding("GB2312");
XmlSerializer serializer = new XmlSerializer(type);
MemoryStream stream = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(stream, gb2312);
writer.Formatting = (toBeIndented ? Formatting.Indented : Formatting.None);
serializer.Serialize(writer, obj, ns);
string xml = gb2312.GetString(stream.ToArray());
writer.Close();
return xml;
}
public static string EndorseXML(GeneralInfo Head, List<EndorseInfo> lEndorse)
{
PolicyEndorsement pe = new PolicyEndorsement();
pe.Head = Head;
pe.EndorseInfos = lEndorse;
StringBuilder sb = new StringBuilder();
sb.Append(ObjectToXml(pe, false, typeof(PolicyEndorsement)));
return sb.ToString();
}
//xml转行为实体类
/// <summary>
/// xml文件转化为实体类列表
/// </summary>
/// <typeparam name="T">实体名称</typeparam>
/// <param name="xml">xml文件</param>
/// <param name="headtag">xml头文件</param>
/// <returns>实体列表</returns>
public static List<T> XmlToObjectList<T>(string xml, string headtag) where T : new()
{
List<T> list = new List<T>();
XmlDocument doc = new XmlDocument();
PropertyInfo[] propinfos = null;
doc.LoadXml(xml);
//XmlNodeList nodelist = doc.SelectNodes(headtag);
XmlNodeList nodelist = doc.GetElementsByTagName(headtag);
foreach (XmlNode node in nodelist)
{
T entity = new T();
//初始化propertyinfo
if (propinfos == null)
{
Type objtype = entity.GetType();
propinfos = objtype.GetProperties();
}
//填充entity类的属性
foreach (PropertyInfo propinfo in propinfos)
{
//实体类字段首字母变成小写的
string name = propinfo.Name.Substring(0, 1) + propinfo.Name.Substring(1, propinfo.Name.Length - 1);
XmlNode cnode = node.SelectSingleNode(name);
string v = cnode.InnerText;
if (!string.IsNullOrEmpty(v))
{
propinfo.SetValue(entity, Convert.ChangeType(v, propinfo.PropertyType), null);
}
}
list.Add(entity);
}
return list;
}
请求:
GeneralInfo gi = new GeneralInfo();
gi.UUID = Settings.UnitID + DateTime.Now.ToString("yyyyMMddHHmmssfff");
gi.PlateformCode = Settings.PartnerID;
List<EndorseInfo> lEndorse = new List<EndorseInfo>();
StringBuilder sb = new StringBuilder(2000);
EndorseInfo ei = new EndorseInfo();
for (int i = 0; i < PolicyNoList.Count; i++)
{
ei = new EndorseInfo();
ei.EndorseDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
ei.PolicyNo = PolicyNoList[i];
lEndorse.Add(ei);
sb.Append(ei.PolicyNo);
}
gi.Md5Value = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(gi.UUID + sb.ToString().Trim(), "MD5").ToLower();
string res = XmlDispose.EndorseXML(gi, lEndorse);
执行:
string resp = pr.insuranceRequest("001005", res);
返回:
List<PolicyInfoReturn> lsReturn = pr.PolicyResultXML(resp);
处理方法:
public List<PolicyInfoReturn> PolicyResultXML(string xml)
{
if (xml.Length > 0)
{
try
{
List<GeneralInfoReturn> gReturn = XmlDispose.XmlToObjectList<GeneralInfoReturn>(xml, "GeneralInfoReturn");
log.Debug("投保G" + gReturn[0].ErrorCode);
if (gReturn[0].ErrorCode == "00")
{
List<PolicyInfoReturn> lsReturn = XmlDispose.XmlToObjectList<PolicyInfoReturn>(xml, "PolicyInfoReturn");
if (lsReturn != null)
{
log.Debug("lsReturn数量:" + lsReturn.Count);
List<InsuredReturn> lsReturnd = XmlDispose.XmlToObjectList<InsuredReturn>(xml, "InsuredReturn");
if (lsReturnd != null)
{
log.Debug("lsReturnd数量:" + lsReturn.Count);
for (int i = 0; i < lsReturnd.Count; i++)
{
if (lsReturnd[i].CheckResult != "00")
{
FrontEnd.SaveHardWareLog("保险投保", "保险人返回值有误" + lsReturnd[i].CheckMessage, "软件故障");
return null;
}
}
return lsReturn;
}
else
{
FrontEnd.SaveHardWareLog("保险投保", "保险人返回值为空", "软件故障");
return null;
}
}
else
{
FrontEnd.SaveHardWareLog("保险投保", "投保返回值为空", "软件故障");
return null;
}
}
else
{
FrontEnd.SaveHardWareLog("保险投保", gReturn[0].ErrorCode.Trim(), "软件故障");
return null;
}
}
catch (Exception ex)
{
return null;
}
}
else
{
log.Debug("返回值信息:" + xml.Length.ToString());
FrontEnd.SaveHardWareLog("保险投保", "返回值为空", "软件故障");
return null;
}
}
来自 <http://www.cnblogs.com/mingmingruyuedlut/archive/2013/05/23/3067227.html>
Data Source=61.153.65.30,3001;Initial Catalog=FrontEnd;Integrated Security=False;User ID=sa;Password=********;Application Name=GLibApplication
来自 <http://blog.csdn.net/ltolll/article/details/10213761>
来自 <http://blog.csdn.net/msdnchina/article/details/50237609>
DataView.ToTable 方法 (String, Boolean, String[])
Visual Studio 2010
根据现有 DataView 中的行,创建并返回一个新的 DataTable。
来自 <https://msdn.microsoft.com/zh-cn/library/h2b6ehaa(v=vs.100).aspx>
未能为 SSL/TLS 安全通道建立信任的解决办法
2016年8月26日
10:31
没有权限 设置权限
WebClient client=new WebClient();
//NetworkCredential credentials = new NetworkCredential("名字", "密码");
//client.Credentials = credentials;
未能为 SSL/TLS 安全通道建立信任的解决办法
最简单的办法是:
1,先加入命名空间:
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
2,再重载CheckValidationResult方法,返回true
public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{ // 总是接受
return true;
}
3,然后在HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);前面加上如下一行代码:
ServicePointManager.ServerCertificatidationCallback = new System.Net.Security.RemoteCertificatidationCallback(CheckValidationResult);//验证服务器证书回调自动验证
//ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
来自 <http://www.cnblogs.com/Jin-1007/archive/2012/04/13/2445596.html>
来自 <http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html>
清空select标签中option
document.formName.selectName.options.length = 0;
来自 <http://www.jb51.net/web/90901.html>
Windows服务
Ztree