从VS 2008中的通用服务合同生成的WSDL问题

时间:2009-05-22 14:35:53

标签: c# wcf generics wsdl

[编辑] 我找到了一种方法让它发挥作用,在代码中发表评论。

我有几十个,很快将有数百个工作流程与以下合同:

[ServiceContract(Namespace = "http://schema.company.com/messages/")]
public interface IBasicContract<TRequest, TResponse>
  where TRequest : class
  where TResponse : class
{
  [OperationContract]
  [XmlSerializerFormat]
  [ServiceKnownType(typeof(Aggregate))]
  TResponse GetReport(TRequest inquiry);

  [OperationContract]
  [XmlSerializerFormat]
  [ServiceKnownType(typeof(Aggregate))]
  string GetRawReport(string guid);

  [OperationContract]
  [XmlSerializerFormat]
  [ServiceKnownType(typeof(Aggregate))]
  TResponse GetArchiveReport(string guid);
}

我创建了一个常见的实现:

// v added
[ServiceBehavior(Namespace = "http://schema.company.com/messages/")]
// ^ added
public abstract class BasicWorkflowSvc<TRequest, TResponse, TWorkflow> : IBasicContract<TRequest, TResponse>
  where TRequest : class
  where TResponse : class
  where TWorkflow : class
{
  //...
}

实际实现如下:

[XmlSerializerFormat]
// v changed
[ServiceContract(Namespace = "http://services.company.com/messages/")]
// ^ changed
public interface IActualProductSvc : IBasicContract<ActualProductRq_Type, ActualProductRs_Type>
{
}

[ServiceBehavior(Namespace = "http://services.company.com/ActualProduct/v1.0")]
// v added
[MessageContract(WrapperNamespace = "http://services.company.com/ActualProduct/v1.0")]
// ^ added
public class ActualProductSvc : BasicWorkflowSvc<ActualProductRq_Type, ActualProductRs_Type, EF>, IActualProductSvc
{
  //...
}

我的问题是:当我将此项目的服务引用添加到另一个项目时,生成的代码具有其他(和无用的)请求和响应类型:

[GeneratedCode("System.ServiceModel", "3.0.0.0")]
[ServiceContract(Namespace = "http://services.company.com/ActualProduct/v1.0", ConfigurationName = "ActualProduct.IActualProductSvc")]
public interface IActualProductSvc
{
  // CODEGEN: Generating message contract since the wrapper namespace (http://schema.company.com/messages/) of message GetReportRequest does not match the default value (http://services.company.com/ActualProduct/v1.0)
  [OperationContract(Action = "http://schema.company.com/messages/IBasicContractOf_ActualProductRq_Type_ActualProductRs_Type/GetReport",
    ReplyAction = "http://schema.company.com/messages/IBasicContractOf_ActualProductRq_Type_ActualProductRs_Type/GetReportResponse")]
  [XmlSerializerFormat()]
  [ServiceKnownType(typeof (Aggregate))]
  GetReportResponse GetReport(GetReportRequest request);

  // CODEGEN: Generating message contract since the wrapper namespace (http://schema.company.com/messages/) of message GetRawReportRequest does not match the default value (http://services.company.com/ActualProduct/v1.0)
  [OperationContract(
    Action = "http://schema.company.com/messages/IBasicContractOf_ActualProductRq_Type_ActualProductRs_Type/GetRawReport",
    ReplyAction = "http://schema.company.com/messages/IBasicContractOf_ActualProductRq_Type_ActualProductRs_Type/GetRawReportResponse")]
  [XmlSerializerFormat()]
  [ServiceKnownType(typeof (Aggregate))]
  GetRawReportResponse GetRawReport(GetRawReportRequest request);

  // CODEGEN: Generating message contract since the wrapper namespace (http://schema.company.com/messages/) of message GetArchiveReportRequest does not match the default value (http://services.company.com/ActualProduct/v1.0)
  [OperationContract(
    Action = "http://schema.company.com/messages/IBasicContractOf_ActualProductRq_Type_ActualProductRs_Type/GetArchiveReport",
    ReplyAction =
      "http://schema.company.com/messages/IBasicContractOf_ActualProductRq_Type_ActualProductRs_Type/GetArchiveReportResponse")]
  [XmlSerializerFormat()]
  [ServiceKnownType(typeof (Aggregate))]
  GetArchiveReportResponse GetArchiveReport(GetArchiveReportRequest request);
}

......带着一堆包装器:

[DebuggerStepThrough()]
[GeneratedCode("System.ServiceModel", "3.0.0.0")]
[MessageContract(WrapperName = "GetReport", WrapperNamespace = "http://schema.company.com/messages/", IsWrapped = true)]
public partial class GetReportRequest
{
  [MessageBodyMember(Namespace = "http://schema.company.com/messages/", Order = 0)]
  public ActualProductRq_Type inquiry;

  public GetReportRequest()
  {
  }

  public GetReportRequest(ActualProductRq_Type inquiry)
  {
    this.inquiry = inquiry;
  }
}

有没有办法,不用手工删除它们,以使这些包装不被生成?我问的原因是,在我尝试从所有工作流程中提取通用合同之前没有生成它们 - 没有与不同命名空间的通用接口 - 并且正在使用这些工作流程的人抱怨必须更新所有工作流程引用然后手动从Reference.cs文件中删除很多东西。

我讨厌Visual Studio中的WSDL导入程序:(

2 个答案:

答案 0 :(得分:0)

在客户端添加或配置服务引用时,会出现一个复选框,提示有关生成异步方法的信息。

如果已选中,请尝试取消选中,然后查看是否删除了自动生成的请求/响应方法。

一年前我遇到了类似的问题,所以解决方案有点模糊。

答案 1 :(得分:0)

如果使用svcutil.exe生成代理类,是否会出现同样的问题?如果是这样,那么这不是VS2008问题。

这个问题并不让我感到惊讶。 .NET中的泛型不是宏。您期望WSDL生成器挖掘出用作实例服务契约实例的实际类型参数的特定类型。我认为这是一件非常重要的事情。

我建议您创建此问题的简单版本,并在http://connect.microsoft.com/visualstudio/上报告。首先快速搜索,看看是否已经报告过。报告后,将报告的网址发布为您的问题的修改,以便其他人可以对其进行投票。