在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的类上加描述[AspNetCompatibilityRequi rements(RequirementsMode = AspNetCompatibilityRequi rementsMode.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>httpRuntimemaxRequestLen
gth="102400" /> 这里的单位是KB,这样就可以传100M的文件了。当然,这么大的文件,最好还是分段传输比较好。
4.出现下列错误的解决方案:
① 无法处理消息,这很可能是因为操作“http://tempuri.org/”不正确,或因为消息包含无效或过期的安全上下文令牌,或因为绑定之间出现不匹配。
解决方法:只需在客户端和服务端的binding节点内修改如下节点: <</SPAN>securitymode="None"></</SPAN>security> ② 超时问题
解决方法:客户端的