最近做了一个web服务,开始什么也不懂,就在网上到处找,对于刚毕业的我,感觉没用实际代码经过自己的手写出来,看什么都一头雾水,然后就看到很多人说webservice已经融入WCF..然后就先创建了WCF..结果感觉不是我想要的 ....,经过很多次以后,其实webservice 也可以单独分出来.然后就来做做笔记,希望大神能指点
1.首先创建web
然后在添加完成的应用程序里面点右键添加,新建项
好了这样就创建好了一个服务..
2 然后,接着开始写webservice 封装接口..为了方便以后扩展首先分层BLL,DAL,Model,Web(这里补充一下,数据库用的是Sybase)
所以现在配置文件connectionStrings下面配置数据库
<connectionStrings>
<!--DSN ODBC数据源-->
<add name="DSN" connectionString="数据库名"/>
<!--加密锁配置-->
<add name="organ" connectionString=""/>
<add name="lockip" connectionString="地址"/>
<add name="nature" connectionString=""/>
</connectionStrings>(这里好像在配置sybase时可以自动就生成了)
3.然后开始写方法了..
先创建一个相关类
public partial class AddTea
{
public AddTea()
{
this.TeaID = "";
this.Name = "";
}
public AddTea(string _teaid,string _name)
{
this.TeaID = _teaid;
this.NAME = _name;
}
/// <summary>
/// 编码
/// </summary>
public string TeaID { get; set; }
/// <summary>
/// 名称
/// </summary>
public string NAME { get; set; }
}
方法:
#region 添加方法--方法上面必须加上[WebMethod]
/// <summary>
/// 添加方法
/// </summary>
/// <param name="data">调用时传进来的参数(json字符串)</param>
[WebMethod]
public string Addtea(string data)
{
string json = "";
//序列化传进来的字符串(序列化的时候AddTea是自己根据业务创建的一个实体类然后进行序列化)
AddTea add = JSONSerializer.Deserialize<AddTea>(data);
//调用业务层添加方法这里面的//GetCon是一个通过机构号获取门店数据库连接密码 返回链接字符串
json = this.AddTeaBLL.AddTea(add, GetCon());
//判断json是否为空
if(!string.IsNullOrEmpty(json))
{
//成功时相应的数据
return "{\"FALSE\":\"0\",\"msg\":\"成功!\"}";
}
else
{
//失败是的处理
return "{\"FALSE\":\"0\",\"msg\":\"成功!\"}";
}
}
#endregion
}
BLL,DAL层相关
//BLL
AddteaDAL addteaDAL = new AddteaDAL();
/// <summary>
/// 添加
/// </summary>
/// <param name="_addtea">添加类</param>
/// <param name="con">字符串连接</param>
/// <returns></returns>
public string AddTea(Addtea _addtea, string _con)
{
return this.addteaDAL.AddTea(_addtea, _con);
}
//DAL
/// <summary>
/// 添加
/// </summary>
/// <param name="_data"></param>
/// <param name="_con"></param>
public string AddTea(AddTea _data, string _con)
{
string sql = "insert into AddTea(ID,PRICE)VALUES(:ID,:PRICE)";
OdbcParameter[] parmbm = new OdbcParameter[] {
new OdbcParameter("ID",data.ID),
new OdbcParameter("PRICE",data.PRICE)
};
Helper.ExecuteNonQuery(sqlbm, con, parmbm); //调用存储过程需要的参数
OdbcParameter[] odbcparm = new OdbcParameter[] { new OdbcParameter(), new OdbcParameter() };
odbcparm[].OdbcType = OdbcType.NVarChar;
odbcparm[].ParameterName = ":TeaID";
odbcparm[].Value = data.TeaID; odbcparm[].OdbcType = OdbcType.NVarChar;
odbcparm[].ParameterName = ":NAME";
odbcparm[].Value = data.NAME; //调用存储过程(?号代表参数,一个问号代表一个参数)
//returnvalue接受存储过程返回的错误信息
object returnvalue=Helper.ExecuteNonQuery("存储过程名 ?,?", con, CommandType.StoredProcedure, odbcparm)
}
上面执行存储过程的方法是重载的一个添加方法只是多了一个(CommandType参数)
}
这是上面存储过程重载的一个方法和错误日志记录的方法
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="sql"></param>
/// <param name="con"></param>
/// <param name="_commandType"></param>
/// <param name="spms"></param>
/// <returns></returns>
public static object ExecuteNonQuery(string sql, string con, CommandType _commandType, params OdbcParameter[] spms )
{
OdbcCommand command = PrepareCommand(sql, con, spms);
command.CommandText = sql;
command.CommandType = CommandType.StoredProcedure;
//command.Parameters.Add("SQLCODE","").Direction = ParameterDirection.ReturnValue;
object result = "";
try
{
if (_commandType == null)
{
command.CommandType = CommandType.Text;
}
else
{
command.CommandType = _commandType;
}
command.Connection.Open();
result = command.ExecuteScalar();
//result += command.Parameters["SQLCODE"].Value.ToString(); }
catch (Exception e)
{
result=e.Message;//接受错误信息返回去
WriteError(e,"");//记录错误日志 }
finally
{
if (command.Connection.State != ConnectionState.Closed)
command.Connection.Close();
} return result;
} /// <summary>
/// 记录错误日志方法
/// </summary>
/// <param name="ex"></param>
/// <param name="LogAddress"></param>
public static void WriteError(Exception ex, string LogAddress = "")
{
//如果日志文件为空,则添加至"C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\DevServer\\10.0, YYYY-mm-dd_Log.log文件
if (LogAddress == "")
{
LogAddress = Environment.CurrentDirectory + '\\' +
DateTime.Now.Year + '-' +
DateTime.Now.Month + '-' +
DateTime.Now.Day + "_Log.log";
}
//把异常信息输出到文件
StreamWriter fs = new StreamWriter(LogAddress, true);
fs.WriteLine("当前时间:" + DateTime.Now.ToString());
fs.WriteLine("异常信息:" + ex.Message);
fs.WriteLine("异常对象:" + ex.Source);
fs.WriteLine("调用堆栈:\n" + ex.StackTrace.Trim());
fs.WriteLine("触发方法:" + ex.TargetSite);
fs.WriteLine();
fs.Close();
}
这样大概的方法就完成。 然后对于新手了我"发布“这个概念也有点不清楚然后网上又是一堆质料最后参考这个地址发布
http://blog.sina.com.cn/s/blog_517cae3c0102v0y7.html
最后在按照这个地址里面的教学出现了两个问题
问题1.
最后在网上找到解决方法iis里面的目录浏览启动:
然后没事了 ..继续 又报错了 。!!
"/"应用程序中的服务器错误.
无法识别的属性"targetFramework".请注意属性名称区分大小写.
虽然都是一些简单的错对于刚毕业的我 还是挺头疼的 然后又自己接着网上找.最后解决了
在IIS里面这样操作两步
第一步:
第二步:
最后千辛万苦终于,完成了。》。现在回首其实比之前开始做做的时候想的要简单得多..这只是自己的做法,也只是大概的写了下..当然中途也不止
这几个问题..只是提出个别的