SilverLight调用WCF”远程服务器返回了错误: NotFound”

 

项目中需要一个上传文件的操作,于是想到一个解决方案:将客服端文件以二进制数组的形式,用WCF传到服务器,在服务器端在写成图片。试过发现此方案可行,但是当文件过大时问题就出现了。

 

错误:“远程服务器返回了错误: NotFound”
解决:
1. 远程服务器返回了错误: NotFound,该错误一般为WCF调用不成功,SL的错误类型是CommunicationException,但是具体的错误类型及信息不完整,通过以下方法,可以使错误信息更加完成。 

2. 在WCF服务的类中加上

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]  

3. 然后在调用此服务的silverlight的初始化方法中加上: 
bool registerResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
bool httpsResult = WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);

参考博客:http://blog.csdn.net/luminji/article/details/5279695

  

查“远程服务器返回了错误: NotFound”错误时,很多文章直接就指出了,引起错误原因:传输的数据量过大,需要配置服务端和客服端的Config。我还是按照以上方案操作了下,调试运行出现下面错误,确定了错误的真正原因。

 

错误:“远程服务器返回了意外响应 400 Bad Request”

解决:

1. WCF服务文件的名称UserRightService.svc、IUserRightService.cs和UserRightService.cs(下面的专业名称可能不太准确)。

UserRightService.svc宿主,里面只关联接口的空间

IUserRightService.cs接口文件

UserRightService.cs具体方法实现文件。

 

2. 下面配置服务端的Config,Config在WCF所属的项目下面:

说明:

1. 2147483647最大字节数,这个是int32的最大字节数,大小是2047M,肯定能适合正常的数据传输。估计不用全部设置成这么大都够用。

2. metadataBehavior 对应的是“<behavior name="metadataBehavior">”的name,名称无所谓,只要与<service behaviorConfiguration="metadataBehavior">对应就好。

3. NewBinding0 对应的是“<binding name="NewBinding0">”的name,名称无所谓,只要与<service>节点下面的<endpoint bindingConfiguration="NewBinding0">对应就好。

4. <bindings>节点下面的绑定类型有BasicHttpBinding和WsHttpBinding两种类型。 要与<endpoint binding="basicHttpBinding">对应。
BasicHttpBinding和WsHttpBinding的异同点,可以参看http://www.cnblogs.com/virusswb/archive/2010/02/21/1670225.html

5. <service name="Microinfo.Map.Services.UserRightService">的name是命名空间(Microinfo.Map.Services)+WCF实现类的类名(UserRightService)。

6. <endpoint contract="Microinfo.Map.Services.IUserRightService"/>的contract是命名空间(Microinfo.Map.Services)+WCF接口(IUserRightService)。

 

服务端Config配置
<configuration>    
<system.serviceModel>
<services>
<service behaviorConfiguration="metadataBehavior" name="Microinfo.Map.Services.UserRightService">
<endpoint binding="basicHttpBinding" bindingConfiguration="NewBinding0" contract="Microinfo.Map.Services.IUserRightService"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="metadataBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
<bindings>
<basicHttpBinding>
<binding name="NewBinding0" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
</configuration>

 

3.下面是客服端Config的设置,这个文件是在引用WCF服务的项目中自动产生的,项目根目录下,原博文说文件名App.Config,但是我的项目中文件名叫ServiceReferences.ClientConfig。一些需要注意的可以参看上面服务端Config设置的说明。

 

客服端Config配置
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IUserRightService" maxBufferSize="2147483647"
maxReceivedMessageSize
="2147483647">
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:2400/WCF/UserRightService.svc"
binding
="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IUserRightService"
contract
="UserRightServiceReference.IUserRightService" name="BasicHttpBinding_IUserRightService" />
</client>
</system.serviceModel>
</configuration>

 参考博客:http://blog.csdn.net/qyr20/article/details/6585606

 

如果配置了服务端和客服端以后还是报错,就需要在实例化WCF服务时候再加代码设置:

 

View Code
AIDClient bll = new AIDClient();
(bll.Endpoint.Binding as NetTcpBinding).MaxReceivedMessageSize = int.MaxValue;
(bll.Endpoint.Binding as NetTcpBinding).MaxBufferSize =int.MaxValue;

 

posted @ 2012-03-02 09:40  简、单  阅读(6956)  评论(0编辑  收藏  举报