具有数组参数的Web服务和方法

时间:2010-01-26 15:24:59

标签: silverlight web-services reporting-services silverlight-4.0

我正在尝试从SQL Reporting Services中包装ReportExecution2005,以便我可以代表Windows Auth Services登录进行域身份验证。

ReportExecution2005定义

SetExecutionParameters(ParameterValue[] Parameters, string ParameterLanguage)

但是当在方法签名中放置任何类型的数组,甚至字符串[]时,服务编译好了但是当我尝试设置服务时在Silverlight项目中引用,VS2010具有混合功能,并且不生成Reference.cs的代码

显然你可以使用数组参数,ReportExecution2005这样做,VS2010设法引用它。

一旦我从参数列表中删除了数组成员,它就会停止呻吟并继续工作。任何人都可以向我解释这里发生了什么?

如果我可以对这部分进行排序我在SL4 RIA应用程序中拥有提供ReportViewer等效功能所需的一切 - 我已经想出在父网页中动态创建IFRAME,确定占位符控件的像素范围并动态调整IFRAME的位置和Z顺序,使其呈现HTML,就像它在“占位符”面板中一样。

我计划将它全部包装为控件并将其发布以供一般使用,直到Microsoft开始为Silverlight生成ReportViewer控件。剩下的部分是操作报告服务并返回呈现的报告的字节。我可以直接在客户端中引用ReportingServices,但不需要凭据来进行往返。

在确定故障性质的过程中,我使用无操作方法构建了简化服务,并逐步添加参数,构建服务并尝试添加它,直到问题发生。

一旦指定了数组参数,就会出现问题。我确信它是一个数组,而不是数组的类型,因为即使数组类型是像字符串这样的内置类型,问题也会发生,服务器和客户端都明白这一点。 / p>

这非常令人费解,因为显然支持数组参数 - 其他服务成功使用它们。这是错误消息:

Custom tool error: Failed to generate code for the service reference 
'ServiceReference1'.  Please check other error and warning messages for details.

没有其他错误消息。有六个警告,但大多数警告也是为成功导入Web服务而发生的。

Custom tool warning:
  Cannot import wsdl:portType
Detail:
  An exception was thrown while running a WSDL import extension:
  System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error:
  Exception has been thrown by the target of an invocation.
XPath to Error Source: 
  //wsdl:definitions[@targetNamespace='']/wsdl:portType[@name='RS2010']
  C:\...\ServiceReference1\Reference.svcmap

Custom tool warning:
  Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
  C:\atom\Silverlight\Argent\Service References\RS2005\Reference.svcmap

Custom tool warning:
  Cannot import wsdl:binding
Detail:
  There was an error importing a wsdl:portType that the wsdl:binding is dependent on.
XPath to wsdl:portType: 
  //wsdl:definitions[@targetNamespace='']/wsdl:portType[@name='RS2010']
XPath to Error Source: 
  //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='CustomBinding_RS2010']
  C:\atom\Silverlight\Argent\Service References\ServiceReference1\Reference.svcmap

Custom tool warning:
  Cannot import wsdl:port
Detail: 
  There was an error importing a wsdl:binding that the wsdl:port is dependent on.
XPath to wsdl:binding: 
  //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='CustomBinding_RS2010']
XPath to Error Source: 
  //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:service[@name='RS2010']/wsdl:port[@name='CustomBinding_RS2010']
  C:\atom\Silverlight\Argent\Service References\ServiceReference1\Reference.svcmap

2 个答案:

答案 0 :(得分:2)

如果在失败的引用上使用配置服务引用... ,并从在所有引用的程序集中重用类型更改为在指定的引用程序集中重用类型,然后取消选择 System.ComponentModel.DataAnnotations System.Windows.Browser ,您会发现问题消失了。

至少它适用于我的琐碎例子。对于更精细的服务,事情可能会更加微妙。

您可以使用高级按钮在首先设置参考时指定这些排除项。我总是忘记,并在以后遇到错误时使用配置

答案 1 :(得分:0)

您需要定义一个ParameterValue数组,然后将其传入。不是字符串数组。

像这样......

ParameterValue[] paramarray = new ParameterValue[n];

--set them

paramarray[0] = new ParameterValue();
paramarray[0].Label = "Text";
paramarray[0].Name = "Key";
paramarray[0].Value = "1";

...

paramarray[n] = new ParameterValue();
paramarray[n].Label = "Text";
paramarray[n].Name = "Key";
paramarray[n].Value = "100";


...SetExecutionParameters(paramarray, "en-us");