最近做了一个sharePoint项目,需要实现的功能是,第三方网站访问我们sharePoint中的数据,通过Webservice方式实现文件的上传和下载。

于是代码工作完成了之后,本地调试没什么问题,部署到服务器上各种问题。

部署到SharePoint的gac缓存中,步骤挺麻烦的,比较容易出错,一定要仔细完成。

注:WebService可以已网站形式发布,但如果用做SharePoint的话还是部署到SharePoint的gac缓存中好

第一步:部署dll到gac缓存中

  1. ​找到项目中的bin\debug文件夹,复制dll到新建的文件夹中,比如:C:\site\Ideal.UploadDocuments.dll

  2. ​打开命令工具,以管理员身份运行,并转到目录C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\ 下

  3. ​输入命令gacutil - if path,其中path为1中的路径,例如:gacutil - if  C:\site\Ideal.UploadDocuments.dll

  4. ​回车确认,这样就将dll部署到了gac缓存中了

  5. 查看dll部署成功与否,可以使用命令:gacutil -u Ideal.UploadDocuments

    卸载dll,可以使用命令:gacutil -l Ideal.UploadDocuments

    如图:

  6. 用同样的方法,部署log4net.dll到gac缓存中
  7. 部署好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记录日志到数据库的更多相关文章

  1. 手动将自定制的WebPart部署到 SharePoint 2010 中

    1.搭建好开发环境,建立webpart工程,写代码. 2.修改assembly.cs文件   在部署前,需要修改assembly文件,增加以下两句: using System.Security; [a ...

  2. 批量删除SharePoint 2010的List中的item

    第一种方式:循环遍历List中的所有item,然后根据条件去判断当前item是否应该被删除[注:要用 i-- 方式去遍历,这也是删除集合里面item的常用做法,如果用 i++ 的方式去遍历删除,会出错 ...

  3. SharePoint 2010 获取列表中所有数据(包括文件夹内)的方法

    转: http://blog.csdn.net/wangwenism/article/details/8751411 SharePoint的列表能存储文件以及文件夹,用户使用的时候,经常会建几个分类文 ...

  4. 在 SharePoint 2010 中访问数据

    转:http://blog.banysky.net/?p=81001 数据访问的关键方法有哪些? | 使用查询类 | 使用 SPQuery | 使用 SPSiteDataQuery | 使用 LINQ ...

  5. 自定义和扩展 SharePoint 2010 Server 功能区

    了解构成 SharePoint 2010 服务器功能区的组件以及如何通过演练两个功能区自定义项方案来自定义功能区. 适用范围: Microsoft SharePoint Foundation 2010 ...

  6. SharePoint 2010在win7 x64 安装

    转:http://kaneboy.blog.51cto.com/1308893/328000 关于<SharePoint 2010应用程序开发指南>,我和杜伟同学正在撰写中,希望下半年早点 ...

  7. 如何清除SharePoint Server 配置缓存

    日常运维中您可能需要清除SharePoint 2010/2013/2016中的过期配置缓存.例如,有时计时器作业往往会卡住,并在这种情况下清除缓存.您可以手动清除SharePoint配置缓存或者使用P ...

  8. SharePoint 2010 BCS - 概述

    博客地址 http://blog.csdn.net/foxdave SharePoint 2010首次引入了BCS的概念 - Business Connectivity Service,即业务连接服务 ...

  9. SharePoint 2010 RBS 安装和配置的一些记录

    1.SharePoint 2010 RBS FILESTREAM Provider 的“垃圾收集”: 在SharePoint 中删除上传的文档RBS并不会在文件系统删除文档,理解只是在内容数据库删除了 ...

随机推荐

  1. java网页数据抓取实例

    在很多行业中,要对行业数据进行分类汇总,及时分析行业数据,对于公司未来的发展,有很好的参照和横向对比.所以,在实际工作,我们可能要遇到数据采集这个概念,数据采集的最终目的就是要获得数据,提取有用的数据 ...

  2. python基础知识回顾之元组

    元组与列表的方法基本一样,只不过创建元组是用小括号()把元素括起来,两者的区别在于,元组的元素不可被修改. 元组被称为只读列表,即数据可以被查询,但不能被修改,列表的切片操作适用于元组. 元组写在小括 ...

  3. C# Excel操作类 ExcelHelper

    实现C#与Excel文件的交互操作,实现以下功能: 1.DataTable 导出到 Excel文件 2.Model数据实体导出到 Excel文件[List<Model>] 3.导出数据到模 ...

  4. 关于在Win10的Windows功能中没有IE11的问题

    大概是用Win7的时候把IE关掉了,升级Win10之后就发现IE不见了,在Windows功能里面也没有:最近因为某些原因需要用到IE,还是用的虚拟机. 网上找到的方法普遍是执行命令:FORFILES ...

  5. 开源作业调度框架 - Quartz.NET - Cron表达式测试

    昨天简单写了一下如何使用Quzrtz.NET. 那么问题来了,我设置了Cron表达式之后如何知道是表达式是否按照预期的时间执行了呢? 我找到了些Cron表达式工具生成了表达式,确发现它们基本上没有进行 ...

  6. Asp.net中DataTable的排序功能

    DataTable里的数据,如果是从数据库中取得的数据,我们可以用order by排序,而从excel表格取得的数据,就需要自己进行操作了. 例如,Dt_Data2是读取Excel表格取到的数据 Da ...

  7. beta冲刺————第三天(3/5)

    完善的具体内容: 前端: (1)可以进行修改文字大小背景 其中,金色的文字个人觉得很好看,点赞.(我很满意啊) (2)可以改变成夜间模式(也很不错啊) 后端: 尝试将本地的后端war文件,以及数据库传 ...

  8. mac层和llczi层

    1.何为数据链路层的(DATA LINK LAYER)的MAC子层和LLC子层? MAC子层的主要功能包括数据帧的封装/卸装,帧的寻址和识别,帧的接收与发送,链路的管理,帧的差 错控制等.MAC子层的 ...

  9. FastDFS分布式文件系统设计原理

    转载自http://blog.chinaunix.net/uid-20196318-id-4058561.html FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker ser ...

  10. Vuex数据页面刷新丢失问题解决方案

    用Vue做项目开发很久了,对于vuex能用.会用,但是因为状态脱离页面和刷新丢失两个原因,一直都有种抵触,特别是一些简单的数据都是通过query或者本地存储就解决了,然而对于一些复杂内容,不可避免的还 ...