Tôi muốn sử dụng svcutil để ánh xạ nhiều không gian tên wsdl tới không gian tên clr khi tạo proxy dịch vụ. Tôi sử dụng phiên bản mạnh mẽ của không gian tên và do đó các không gian tên clr được tạo ra là khó xử và có thể có nghĩa là nhiều thay đổi mã phía máy khách nếu phiên bản không gian tên wsdl/xsd thay đổi. Một ví dụ mã sẽ tốt hơn để hiển thị những gì tôi muốn.sử dụng svcutil để ánh xạ nhiều không gian tên để tạo proxy dịch vụ wcf
// 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 - mà không có bản đồ không gian tên
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
Proxy tạo ra trông giống như
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{}
}
Các lớp khách hàng nằm ngoài bất kỳ không gian tên. Bất kỳ thay đổi nào đối với không gian tên xsd sẽ ngụ ý thay đổi tất cả các câu lệnh bằng cách sử dụng trong mã máy khách của tôi mà tất cả các build đều sẽ phá vỡ.
2. svcutil - với lập bản đồ không gian tên wildcard
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
Proxy tạo ra trông giống như Thông báo
namespace MyDomain.ServiceProxy
{
public partial class Customer{}
public partial class Address{}
public partial class Address1{}
public partial class CustomerServiceClient{}
public partial class StoreServiceClient{}
}
rằng svcutil đã tự động thay đổi một trong những lớp Địa chỉ để Address1. Tôi không thích điều này. Tất cả các lớp khách hàng cũng nằm trong cùng một không gian tên.
Những gì tôi muốn
Something như thế này:
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
Bằng cách này tôi có thể logic nhóm namespace clr và bất kỳ thay đổi namespace wsdl/xsd được xử lý trong thế hệ proxy chỉ mà không ảnh hưởng phần còn lại của mã phía máy khách.
Hiện tại điều này là không thể. Svcutil cho phép ánh xạ chỉ một hoặc tất cả các không gian tên, không phải danh sách các ánh xạ.
tôi có thể làm một bản đồ như hình dưới đây nhưng không nhiều
svcutil.exe
/t:code *.wsdl *.xsd
/n:"http://mydomain.com/xsd/Model/Store/2009/07/01, MyDomain.Model.Address"
/o:TestClient\WebServiceProxy4.cs
Nhưng có bất kỳ giải pháp. Svcutil không phải là ma thuật, nó được viết bằng. Net và lập trình tạo ra các proxy. Có ai viết một thay thế cho svcutil hoặc chỉ cho tôi để hướng dẫn để tôi có thể viết một.
gì sẽ xảy ra nếu bạn chỉ cần sử dụng "Add Service Reference"? –
Tôi chưa thử vì tôi cần sử dụng svcutil để tạo proxy từ dll. Nhưng tôi đoán rằng "thêm tham chiếu dịch vụ" có tùy chọn để chỉ nhập một không gian tên, nó sẽ giống như ánh xạ vùng tên ký tự đại diện. – softveda