WCF添加服务引用 - 集合类型不断尝试使用System.Array

时间:2014-06-02 17:58:29

标签: c# .net wpf web-services wcf

我在向WPF应用程序添加自定义WCF服务引用时遇到问题。我已经为这项服务和应用程序工作了近6个月,直到今天才遇到这个问题。每当我尝试通过"添加服务参考添加WCF服务时,"我返回List的所有方法都试图返回T []。当我配置服务引用并将集合类型更改为" System.Collection.Generics.List"时,它在状态栏中显示它正在更新引用代码,但WPF应用程序中的方法正在抛出错误表明它无法隐式地从List转换为Array。它似乎是在我将更新推送到服务器之后发生的,但唯一改变的是我的一个对象被初始化的方式。到目前为止,我已尝试过以下内容;

  • 清理项目
  • 清理解决方案
  • 重建解决方案
  • 手动删除obj / bin /服务引用文件夹
  • 删除并重新发布了wcf服务
  • 重新启动服务器

我完全失去了,不知道该做什么。非常感谢任何帮助!

更新

我创建了一个单独的控制台项目,一旦配置为返回列表,它就会正确挂钩到WCF服务。看起来特别是WPF项目的一个问题。

更新2

我注意到在我尝试构建时会出现以下错误。它们会在一段时间后消失,但我不知道这是否与此问题有关。它们都在App.config文件中。

  • ' bindingConfiguration'属性无效 - 值' BasicHttpBinding_ICustomService'根据其数据类型' serviceBindingConfigurationType' - 枚举约束失败。

  • &#39>合同'属性无效 - 值' CustomServerSvc.ICustomServer'根据其数据类型' clientContractType' - 枚举约束失败。

更新3

有趣的是,这似乎只是在构建后随机发生在客户端。

按请求添加我的web.config。

<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="UnifyServer.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <connectionStrings>
    <add name="DebugUnifyCS"
          connectionString="connectionString"
          providerName="System.Data.SqlClient" />
    <add name="UnifyCS"
          connectionString="connectionString"
          providerName="System.Data.SqlClient" />
  </connectionStrings>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <client />
    <bindings>
      <basicHttpBinding>
        <binding name="myBasicBinding" maxBufferPoolSize="524288" maxBufferSize="2147483647"
          maxReceivedMessageSize="2147483647" receiveTimeout="00:30:00" sendTimeout="00:30:00">
          <readerQuotas maxDepth="128" maxStringContentLength="2147483647"
            maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <!--<bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IUnifyServer" >
          <security mode="None" />
        </binding>
      </basicHttpBinding>
    </bindings>-->
      <services>
        <service name="UnifyServer.UnifyServer">
          <endpoint address="UnifyServer" binding="basicHttpBinding" bindingConfiguration="myBasicBinding" contract="UnifyServer.IUnifyServer"></endpoint>
          <host>
            <baseAddresses>
              <add baseAddress="http://unifysrv2012:19081/"/>
            </baseAddresses>
          </host>
        </service>
        <service name="UnifyServer.ServiceEndpoint">
          <endpoint address="ServiceEndpoint" binding="basicHttpBinding" bindingConfiguration="myBasicBinding" contract="UnifyServer.IServiceEndpoint"></endpoint>
          <host>
            <baseAddresses>
              <add baseAddress="http://unifysrv2012:19081/"/>
            </baseAddresses>
          </host>
        </service>
      </services>
      <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

  <applicationSettings>
    <UnifyServer.Properties.Settings>
      <setting name="UnifyServer_some_service" serializeAs="String">
        <value>https://some.url.com/some_service.asmx</value>
      </setting>
    </UnifyServer.Properties.Settings>
  </applicationSettings>
</configuration>

2 个答案:

答案 0 :(得分:0)

我怀疑任何服务引用都会更新,因为您在更新服务引用时遇到错误。

尝试从这些步骤开始,每一步都独立于其他&amp;可能是问题的原因:

  • 确保为您的服务接口声明[ServiceContract],因为这会产生确切的错误。

  • 如果您重新分解了代码或更改了任何文件/命名空间。确保它适用于所有地方。

  • web.config中使用Namespace的完全限定服务名称;

  • 确保System.ServiceModel&amp; System.Runtime.Serialization引用并不缺失。

  • 关闭VS后删除.SUO(解决方案用户选项文件)文件。这将重置VS中的XMLEditor组件的缓存。


<强>更新

错误The 'bindingConfiguration' attribute is invalid - The value 'BasicHttpBinding_ICustomService' is invalid according to its datatype 'serviceBindingConfigurationType' - The Enumeration constraint failed.

确保所有服务接口/合同都具有[ServiceContract]属性,方法有[Operation Contract]

还要确保所有DataContract属性都有[DataMember]枚举具有[EnumMember]属性。


更新2

我遇到的一个案例是某些属性无法序列化。例如我正在返回DataSet,默认情况下不能通过wcf序列化为二进制,这会导致错误。

在最坏的情况下,您必须将数据合同和数据分开。重用它们&amp;必须使用SVCUtil手动生成代理。我知道这听起来很疯狂。但有时当所有事情都不起作用时,它似乎正在发挥作用。

让我知道它是否有效。

答案 1 :(得分:0)

这种情况经常发生,因此当您添加对WCF服务的引用时,请检查:

  1. 在“添加服务参考”屏幕中,按“高级...”按钮(位于底部)。

  2. 在刚刚打开的“服务参考设置”屏幕的中间部分,您会看到指定集合类型的2个组合,请选择正确的,然后单击确定。

  3. enter image description here