将WebService部署到 SharePoint 2010 gac 缓存中,并用Log4Net记录日志到数据库
最近做了一个sharePoint项目,需要实现的功能是,第三方网站访问我们sharePoint中的数据,通过Webservice方式实现文件的上传和下载。
于是代码工作完成了之后,本地调试没什么问题,部署到服务器上各种问题。
部署到SharePoint的gac缓存中,步骤挺麻烦的,比较容易出错,一定要仔细完成。
注:WebService可以已网站形式发布,但如果用做SharePoint的话还是部署到SharePoint的gac缓存中好
第一步:部署dll到gac缓存中
找到项目中的bin\debug文件夹,复制dll到新建的文件夹中,比如:C:\site\Ideal.UploadDocuments.dll
打开命令工具,以管理员身份运行,并转到目录C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\ 下
输入命令gacutil - if path,其中path为1中的路径,例如:gacutil - if C:\site\Ideal.UploadDocuments.dll
回车确认,这样就将dll部署到了gac缓存中了
查看dll部署成功与否,可以使用命令:gacutil -u Ideal.UploadDocuments
卸载dll,可以使用命令:gacutil -l Ideal.UploadDocuments
如图:
- 用同样的方法,部署log4net.dll到gac缓存中
部署好dll后还要生成wdsl文件等,这几步会比较麻烦
第二步:部署服务到SharePoint中
1)将Web Service的 *.asmx 文件用记事本打开,将其中的代码
<%@ WebServiceLanguage="C#"CodeBehind="ClassName.asmx.cs"Class="YourNameSpace.YourClass"%>
改为如下代码
<%@ WebServiceLanguage="C#"Class="YourNameSpace.YourClass,YourNameSpace,Version=YourVersion,Culture=neutral,PublicKeyToken=YourPublicKeyToken"%>
其中YourNameSpace,YourVersion,YourPublicKeyToken可以通过在C:\Windows\assembly\右击dll文件的属性查看到,YourClass即为开发Web Service的类名。
2)将Web Service的 *.asmx 文件复制到 C:\ProgramFiles\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS 中,使用disco.exe(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\文件夹下)工具去发现这个Web Service,以生成 .disco 和 .wsdl 文件,生成的文件也在C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\文件夹下,运行如下命令生成:
disco http://MyServerName/_layouts/WebServiceName.asmx
3)打开 .disco 和 .wsdl 文件,并将头部XML声明代码 (<?xml version="1.0" encoding="utf-8"?>) 替换为下列代码:
1
|
<%@ PageLanguage= "C#" Inherits= "System.Web.UI.Page" %><%@ AssemblyName= "Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %><%@ ImportNamespace= "Microsoft.SharePoint.Utilities" %><%@ ImportNamespace= "Microsoft.SharePoint" %><% Response.ContentType= "text/xml" ; %> |
4)将.disco 文件中discovery节点中的代码替换如下:
<discovery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/disco/"> <contractRefref=<%SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request) + "?wsdl"),Response.Output); %>docRef=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %>xmlns="http://schemas.xmlsoap.org/disco/scl/" /> <soapaddress=<%SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %>xmlns:q1="http://tempuri.org/" binding="q1:UploadDocSoap " xmlns="http://schemas.xmlsoap.org/disco/soap/" /> <soapaddress=<%SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %>xmlns:q2="http://tempuri.org/" binding="q2:UploadDocSoap12 " xmlns="http://schemas.xmlsoap.org/disco/soap/" /> </discovery>
并将上面的UploadDoc 替换成你的webservice的类名。
5)将.wsdl 文件中指定的 SOAP 地址替换如下:
<soap:addresslocation=<%SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %>/><soap12:addresslocation=<%SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %>/>
6)将*.disco 和*.wsdl文件分别重命名为*disco.aspx 和*wsdl.aspx;
7)将*.asmx ,*disco.aspx 和*wsdl.aspx这三个文件一起复制到C:\ProgramFiles\Common Files\Microsoft Shared\web server extensions\14\ISAPI\文件夹下,然后就可以直接调用了,调用地址如下:http://MyServerName/_vti_bin/*.asmx
如图:
第三步:将log4Net加入到webservice中
由于这种方式是部署到gac缓存中的,并不能像部署网站那样有自己的web.config,bin文件夹,已经global.asax等
因此如果使用Log4Net记录日志的话和普通的使用方法有点出入。
部署到gac缓存中,就相当于将webservice部署到了SharePoint中了,那么它将会读取SharePoint网站中的webconfig,因此只要将相关配置移植到SharePoint网站下的webconfig中即可。
webconfig 路径如何找到呢?打开iis,找到SharePoint网站,右键选择【浏览】,在打开的目录中即可找到webconfig
1 复制如下定义到相应节点
<configuration> <configSections> <!-- log4net的定义 --> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> </configuration>
2 将log4Net的配置放入到configuration 中,关于配置说明这里就不细说了,主要是配置日志记录到sql server中和log文件中
<log4net debug="true"> <!-- Define some output appenders --> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout" > <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/> </layout> </appender> <appender name="SqlServerLogAppender" type="log4net.Appender.AdoNetAppender"> <!--缓冲区大小,指缓冲到几条日志后才一次性写入数据库--> <bufferSize value=""/> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <connectionString value="Data Source=localhost;Initial Catalog=WebServiceLog;Integrated Security=True;MultipleActiveResultSets=True" /> <commandText value="INSERT INTO T_SYSTEM_LOG (LOG_DATE,LOG_LEVEL,LOG_INFO) VALUES (@LOG_DATE,@LOG_LEVEL,@LOG_INFO)" /> <parameter> <parameterName value="@LOG_DATE" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout" /> </parameter> <parameter> <parameterName value="@LOG_LEVEL" /> <dbType value="String" /> <size value="" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value="@LOG_INFO" /> <dbType value="String" /> <size value="" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%message" /> </layout> </parameter> </appender> <appender name="RunTimeLogAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="logs\\RunTime\\" /> <param name="AppendToFile" value="true" /> <param name="StaticLogFileName" value="false"/> <param name="DatePattern" value="yyyyMMdd".log""/> <param name="RollingStyle" value="Date"/> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/> </layout> </appender> <!-- Setup the root category, add the appenders and set the default level --> <root> <level value="All" /> </root> <logger name="UserLog" additivity="false"> <level value="Info" /> <appender-ref ref="SqlServerLogAppender" /> </logger> <logger name="RunTime" additivity="false"> <level value="All" /> <appender-ref ref="RunTimeLogAppender" /> </logger> </log4net>
3.如果之前你是将log4net初始化放到了global.asax ,那么请删除它,将下面语句加入到Assembleyinfo文件中
[assembly: log4net.Config.XmlConfigurator()]
4.重新编译webservice,并按照第一步步骤重新将dll更新到gac缓存中。
5.重启IIS,使用命令:iisreset 即可
第四步:验证log4net是否成功写入数据库或者log文件中
例如在下载文件的服务里记录了日志,下载个文件试试:
查看sqlserver 中的表,如下:
如果程序出错,按照log4net的配置会记录到log日志文件中,查看SharePoint网站下的目录发现多了个logs文件夹
打开log文件,日志成功记录
至此将WebService部署到 SharePoint 2010 gac 缓存中,并用Log4Net记录日志到数据库已完成。有么有更好的方法,欢迎留言交流,谢谢!
将WebService部署到 SharePoint 2010 gac 缓存中,并用Log4Net记录日志到数据库的更多相关文章
- 手动将自定制的WebPart部署到 SharePoint 2010 中
1.搭建好开发环境,建立webpart工程,写代码. 2.修改assembly.cs文件 在部署前,需要修改assembly文件,增加以下两句: using System.Security; [a ...
- 批量删除SharePoint 2010的List中的item
第一种方式:循环遍历List中的所有item,然后根据条件去判断当前item是否应该被删除[注:要用 i-- 方式去遍历,这也是删除集合里面item的常用做法,如果用 i++ 的方式去遍历删除,会出错 ...
- SharePoint 2010 获取列表中所有数据(包括文件夹内)的方法
转: http://blog.csdn.net/wangwenism/article/details/8751411 SharePoint的列表能存储文件以及文件夹,用户使用的时候,经常会建几个分类文 ...
- 在 SharePoint 2010 中访问数据
转:http://blog.banysky.net/?p=81001 数据访问的关键方法有哪些? | 使用查询类 | 使用 SPQuery | 使用 SPSiteDataQuery | 使用 LINQ ...
- 自定义和扩展 SharePoint 2010 Server 功能区
了解构成 SharePoint 2010 服务器功能区的组件以及如何通过演练两个功能区自定义项方案来自定义功能区. 适用范围: Microsoft SharePoint Foundation 2010 ...
- SharePoint 2010在win7 x64 安装
转:http://kaneboy.blog.51cto.com/1308893/328000 关于<SharePoint 2010应用程序开发指南>,我和杜伟同学正在撰写中,希望下半年早点 ...
- 如何清除SharePoint Server 配置缓存
日常运维中您可能需要清除SharePoint 2010/2013/2016中的过期配置缓存.例如,有时计时器作业往往会卡住,并在这种情况下清除缓存.您可以手动清除SharePoint配置缓存或者使用P ...
- SharePoint 2010 BCS - 概述
博客地址 http://blog.csdn.net/foxdave SharePoint 2010首次引入了BCS的概念 - Business Connectivity Service,即业务连接服务 ...
- SharePoint 2010 RBS 安装和配置的一些记录
1.SharePoint 2010 RBS FILESTREAM Provider 的“垃圾收集”: 在SharePoint 中删除上传的文档RBS并不会在文件系统删除文档,理解只是在内容数据库删除了 ...
随机推荐
- 《SQL Server 2008从入门到精通》--20180723
目录 1.架构 1.1.创建架构并在架构中创建表 1.2.删除架构 1.3.修改表的架构 2.视图 2.1.新建视图 2.2.使用视图修改数据 2.3.删除视图 3.索引 3.1.聚集索引 3.2.非 ...
- Linux 配置 hosts
1. hosts 是什么 维基百科对 hosts 的介绍如下: hosts文件(域名解析文件)是一个用于储存计算机网络中各节点信息的计算机文件. 这个文件负责将主机名称映射到相应的IP地址. host ...
- 【转】Java学习---集合框架那些事
[原文]https://www.toutiao.com/i6593220692525711885/ Arraylist 与 LinkedList 异同 1. 是否保证线程安全: ArrayList 和 ...
- TiDB数据库集群安装以及注意事项
今天尝试安装tidb集群.详细的安装步骤我们参考:https://pingcap.com/docs-cn/op-guide/ansible-deployment/ . 不过安装之前需要一些注意事项. ...
- 使用Python+opencv2时的文件命名及路径问题
最近在做一个数字图像的小项目,在最后的界面与程序结合阶段总是出现单个程序可以运行,但是使用界面传递的参数就运行不了的情况.在网上查了很多相关错误,最终确定是文件命名问题. 错误如下: cv2.erro ...
- SDN期末作业-通过SDN的应用实现负载均衡
负载均衡程序 1.程序链接:https://github.com/424baopu/software/tree/master/LoadBalance 2.场景 topo: 场景描述: 服务器host ...
- 不能用c99的情况下,如何动态定义数组的长度
#include <stdio.h>#include <stdlib.h> int main(int argc, char const *argv[]){ int num ...
- Sqlite的安装和简单使用
Sqlite 1 安装 首先,下载相应的版本: https://sqlite.org/download.html 其次,解压到本地,并添加到环境变量. 然后,打开 CMD 创建,输入 sqlite3 ...
- PyQt5 的几个核心模块作用
QtCore 包含了核心的非GUI功能.此模块用于处理时间.文件和目录.各种数据类型.流.URL.MIME类型.线程或进程. QtGui 包含类窗口系统集成.事件处理.二维图形.基本成像.字体和文 ...
- C语言:值传递,地址传递和引用传递(example:值交换)
于C语言中值传递.地址传递和引用传递的我个人理解. 通过一个例子:swap(交换两个整型变量的值)来表现! #include <stdio.h> void swap1(int* a,int ...