zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    javascript基础
    DOM操作
    js各种弹框
    ZeroMQ,史上最快的消息队列(转)
    mysql 存储过程
    java数据结构与算法(二)----栈和队列
    java数据结构与算法(一)----数组简单排序
    软件开发流程(转)
    Digest [information value filtering]
    Facebook 的系统架构(转)
  • 原文地址:https://www.cnblogs.com/mygod/p/2376613.html
Copyright © 2011-2022 走看看