WCF 中获取绝对路径问题

本文探讨了在WCF服务中尝试使用Server.MapPath获取绝对路径时遇到的问题,由于默认不支持ASP.NET相容模式,导致HttpContext不可用。解决方案包括启用aspNetCompatibilityEnabled属性或采用替代方法来获取服务的发布目录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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>

  ② 超时问题

    解决方法:客户端的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值