我在向WPF应用程序添加自定义WCF服务引用时遇到问题。我已经为这项服务和应用程序工作了近6个月,直到今天才遇到这个问题。每当我尝试通过"添加服务参考添加WCF服务时,"我返回List的所有方法都试图返回T []。当我配置服务引用并将集合类型更改为" System.Collection.Generics.List"时,它在状态栏中显示它正在更新引用代码,但WPF应用程序中的方法正在抛出错误表明它无法隐式地从List转换为Array。它似乎是在我将更新推送到服务器之后发生的,但唯一改变的是我的一个对象被初始化的方式。到目前为止,我已尝试过以下内容;
我完全失去了,不知道该做什么。非常感谢任何帮助!
更新
我创建了一个单独的控制台项目,一旦配置为返回列表,它就会正确挂钩到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>
答案 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服务的引用时,请检查:
在“添加服务参考”屏幕中,按“高级...”按钮(位于底部)。
在刚刚打开的“服务参考设置”屏幕的中间部分,您会看到指定集合类型的2个组合,请选择正确的,然后单击确定。