WCF 中获取绝对路径问题

来源:互联网 发布:淘点点 淘宝外卖 编辑:程序博客网 时间:2024/06/05 15:55
在WCF中调用Server.MapPath 获取服务发布目录路径

在WCF中想使用Server.Map获取当前服务发布目录的绝对路径。可是在调试时却发现:

“System.Web.HttpContext.Current.Server.MapPath("..." + filename);”

“当没有开启ASP.NET相容模式时(aspNetCompatibilityEnabled="true"),WCF不支持HttpContext, HttpApplication,大部分文章都建议修改<serviceHostingEnvironment aspNetCompatibilityEnabled="true">使WCF可使用ASP.NET传统做法。”

最后有两种解决方法:

string t1 = System.Web.HttpContext.Current.Server.MapPath("~");
//以上写法在WCF未开aspNetCompatibilityEnabled时,//会因HttpContext.Current == null发生错误      
string t2 = System.Web.Hosting.HostingEnvironment.MapPath("~");
//以上写法在WCF中使用没有问题
但以上两种方法在单元测试里始终为NULL返回
 
第三种方法:

                var rootDirectory = System.AppDomain.CurrentDomain.BaseDirectory;                var relativeDirectory = Path.Combine("Photos", obj.AlbumId.ToString());                var dir = Path.Combine(rootDirectory, relativeDirectory);                if (!Directory.Exists(dir))                    Directory.CreateDirectory(dir);

                var fileName = Guid.NewGuid().ToString() + "." + obj.ImageType;                var filePath = Path.Combine(dir, fileName);                var fileStream = new MemoryStream(obj.ImageData);                var bitmap = Bitmap.FromStream(fileStream);                bitmap.Save(filePath);

 
第三种方法也可用在单元测试里,测试通过
 
 

1.在WCF服务端使用HttpContext.Current为空的解决方案:

  1)在服务端WCF的类上加描述[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

  2)在服务端WEBCONFIG的节点里加

2.在WCF服务端使用HttpContext.Current.Server.MapPath的替代解决方案:

  System.Web.Hosting.HostingEnvironment.MapPath("~/Upload" + fileFolder);

3.解决大文件byte[]传输的问题:

  服务端,Web.config文件里,Bindings节是空的,而Service也没有指定bindingConfiguration属性,那么它们采用的就是默认的65535的大小。

  问题找到,解决就比较容易了:

  在Bindings节添加新的Binding设置(位于system.serviceModel节点),指定最大接受数据:

  <</SPAN>bindings>   <</SPAN>basicHttpBinding>   <</SPAN>binding name="LargeData" maxReceivedMessageSize="2147483647" messageEncoding="Text"             transferMode="Streamed" sendTimeout="00:10:00" />   </</SPAN>basicHttpBinding>   </</SPAN>bindings> 

  之后给相应的Service指定bindingConfiguration属性:

  <</SPAN>service behaviorConfiguration="Server.Service.WcfServiceBehavior" name="Server.Service.WcfService">   <</SPAN>endpoint address="" binding="basicHttpBinding" bindingConfiguration="LargeData"          contract="Server.Service.WcfService" />   <</SPAN>endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />   </</SPAN>service> 

  这样就可以从客户端发送足够大的数据了。

  P.S.:

  .net默认只能传4M的文件,所以尽管设定了Wcf两端的配置,还是超不出.net的限定,所以如果要传输大文件,还需要在System.Web节下加上

 <</SPAN>httpRuntimemaxRequestLength="102400" />  

  这里的单位是KB,这样就可以传100M的文件了。当然,这么大的文件,最好还是分段传输比较好。

4.出现下列错误的解决方案:

  ① 无法处理消息,这很可能是因为操作“http://tempuri.org/”不正确,或因为消息包含无效或过期的安全上下文令牌,或因为绑定之间出现不匹配。

    解决方法:只需在客户端和服务端的binding节点内修改如下节点: <</SPAN>securitymode="None"></</SPAN>security>

  ② 超时问题

    解决方法:客户端的

原创粉丝点击