2009-07-09 38 views
12

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.

+0

gì sẽ xảy ra nếu bạn chỉ cần sử dụng "Add Service Reference"? –

+0

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

Trả lời

20

Bạn có thể thực hiện nhiều ánh xạ vùng tên bằng cách cung cấp các tham số không gian tên bổ sung - không phải bằng dấu chấm phẩy tách chúng. Vì vậy, ví dụ của bạn nên thay thế là

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

Mặc dù, tôi hiện đang gặp sự cố khi các loại được tạo từ tệp .xsd không bị ảnh hưởng bởi các không gian tên này. Chỉ các loại được tạo từ các tệp .wsdl mới có. Các tài liệu ngụ ý rằng cả hai nên được.

+2

Bất kỳ may mắn nào cũng nhận được ánh xạ vùng tên để ảnh hưởng đến các loại xsd? –

+0

@Lester: Tôi đã không theo đuổi nó nhiều hơn nữa vào thời điểm đó. Chúng tôi đã kết thúc tránh sự cần thiết cho xsds bằng cách nhúng những loại trong wsdls tôi nghĩ. (Đã 3 năm rồi, hãy nhớ bạn.) Có lẽ VS2010 đã cải thiện tình huống này? Ở trên đã được thực hiện với VS2008. –

+1

@DaveCameron Một vài năm trôi qua, và tôi vẫn đang gặp vấn đề tương tự trong VS2013 :-( –

0

Chỉ trong trường hợp bạn muốn ánh xạ tất cả các không gian tên schema để một không gian tên CLR thì:

SvcUtil "your wsdl file.xml" /n:*,RequiredClrNamespace 
Các vấn đề liên quan