gpt4 book ai didi

wcf - 使用 svcutil 映射多个命名空间以生成 wcf 服务代理

转载 作者:行者123 更新时间:2023-12-03 23:25:30 34 4
gpt4 key购买 nike

我想在生成服务代理时使用 svcutil 将多个 wsdl 命名空间映射到 clr 命名空间。我使用命名空间的强版本控制,因此生成的 clr 命名空间很尴尬,如果 wsdl/xsd 命名空间版本发生变化,可能意味着许多客户端代码会发生变化。一个代码示例会更好地显示我想要的。

// Service code
namespace TestService.StoreService
{
[DataContract(Namespace = "http://mydomain.com/xsd/Model/Store/2009/07/01")]
public class Address
{
[DataMember(IsRequired = true, Order = 0)]
public string street { get; set; }
}

[ServiceContract(Namespace = "http://mydomain.com/wsdl/StoreService-v1.0")]
public interface IStoreService
{
[OperationContract]
List<Customer> GetAllCustomersForStore(int storeId);

[OperationContract]
Address GetStoreAddress(int storeId);
}

public class StoreService : IStoreService
{
public List<Customer> GetAllCustomersForStore(int storeId)
{
throw new NotImplementedException();
}

public Address GetStoreAddress(int storeId)
{
throw new NotImplementedException();
}
}
}

namespace TestService.CustomerService
{
[DataContract(Namespace = "http://mydomain.com/xsd/Model/Customer/2009/07/01")]
public class Address
{
[DataMember(IsRequired = true, Order = 0)]
public string city { get; set; }
}

[ServiceContract(Namespace = "http://mydomain.com/wsdl/CustomerService-v1.0")]
public interface ICustomerService
{
[OperationContract]
Customer GetCustomer(int customerId);

[OperationContract]
Address GetStoreAddress(int customerId);
}

public class CustomerService : ICustomerService
{
public Customer GetCustomer(int customerId)
{
throw new NotImplementedException();
}

public Address GetStoreAddress(int customerId)
{
throw new NotImplementedException();
}
}
}

namespace TestService.Shared
{
[DataContract(Namespace = "http://mydomain.com/xsd/Model/Shared/2009/07/01")]
public class Customer
{
[DataMember(IsRequired = true, Order = 0)]
public int CustomerId { get; set; }
[DataMember(IsRequired = true, Order = 1)]
public string FirstName { get; set; }
}
}

1. svcutil - 没有命名空间映射
svcutil.exe /t:metadata 
TestSvcUtil\bin\debug\TestService.CustomerService.dll
TestSvcUtil\bin\debug\TestService.StoreService.dll

svcutil.exe /t:code *.wsdl *.xsd /o:TestClient\WebServiceProxy.cs

生成的代理看起来像
namespace mydomain.com.xsd.Model.Shared._2009._07._011
{
public partial class Customer{}
}
namespace mydomain.com.xsd.Model.Customer._2009._07._011
{
public partial class Address{}
}
namespace mydomain.com.xsd.Model.Store._2009._07._011
{
public partial class Address{}
}

客户端类不在任何命名空间中。对 xsd 命名空间的任何更改都意味着更改我的客户端代码中的所有 using 语句,所有构建都会中断。

2. svcutil - 带有通配符命名空间映射
svcutil.exe /t:metadata 
TestSvcUtil\bin\debug\TestService.CustomerService.dll
TestSvcUtil\bin\debug\TestService.StoreService.dll

svcutil.exe /t:code *.wsdl *.xsd /n:*,MyDomain.ServiceProxy
/o:TestClient\WebServicesProxy2.cs

生成的代理看起来像
namespace MyDomain.ServiceProxy
{
public partial class Customer{}
public partial class Address{}
public partial class Address1{}
public partial class CustomerServiceClient{}
public partial class StoreServiceClient{}
}

请注意,svcutil 已自动将 Address 类之一更改为 Address1。我不喜欢这个。所有客户端类也在同一个命名空间内。

我想要的

像这样的东西:
svcutil.exe 
/t:code *.wsdl *.xsd
/n:"http://mydomain.com/xsd/Model/Shared/2009/07/01, MyDomain.Model.Shared;http://mydomain.com/xsd/Model/Customer/2009/07/01, MyDomain.Model.Customer;http://mydomain.com/wsdl/CustomerService-v1.0, MyDomain.CustomerServiceProxy;http://mydomain.com/xsd/Model/Store/2009/07/01, MyDomain.Model.Store;http://mydomain.com/wsdl/StoreService-v1.0, MyDomain.StoreServiceProxy"
/o:TestClient\WebServiceProxy3.cs

这样,我可以对 clr 命名空间进行逻辑分组,并且对 wsdl/xsd 命名空间的任何更改仅在代理生成中处理,而不会影响客户端代码的其余部分。

现在这是不可能的。 svcutil 允许仅映射一个或所有命名空间,而不是映射列表。

我可以进行如下所示的一个映射,但不能进行多个映射
svcutil.exe 
/t:code *.wsdl *.xsd
/n:"http://mydomain.com/xsd/Model/Store/2009/07/01, MyDomain.Model.Address"
/o:TestClient\WebServiceProxy4.cs

但是有什么解决办法。 Svcutil 并不神奇,它是用 .Net 编写的并以编程方式生成代理。有没有人写过 svcutil 的替代品或者给我指路,这样我就可以写一个。

最佳答案

以防万一您想将所有模式命名空间映射到一个 CLR 命名空间,然后:

SvcUtil "your wsdl file.xml" /n:*,RequiredClrNamespace

关于wcf - 使用 svcutil 映射多个命名空间以生成 wcf 服务代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1103686/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com