2011-07-08 20 views
6

Tôi có dịch vụ wcf. Tôi đã cố gắng tạo mã proxy và tệp cấu hình cho chương trình khách hàng của svcutil:svcutil không tạo tệp cấu hình

svcutil http://localhost/WcfService2/Files.svc 

Tôi đã nhận tệp hợp lệ với proxy nhưng không nhận được tệp cấu hình. Tại sao? (VS2010 SP1, .NET 4.0, IIS 7,0)

hợp đồng dịch vụ của tôi:

[ServiceContract] 
public interface IFiles 
{ 
    [OperationContract] 
    Guid UploadFile(Stream stream); 
} 

cấu hình web của tôi:

<?xml version="1.0"?> 
<configuration> 

    <system.serviceModel> 
    <bindings> 
     <webHttpBinding> 
     <binding name="WebHttpBinding" maxBufferSize="65536" maxBufferPoolSize="524288" 
      maxReceivedMessageSize="1073741824" transferMode="Streamed" /> 
     </webHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="MyServiceBehavior" name="WcfService2.Files"> 
     <endpoint behaviorConfiguration="WebHttpBehavior" binding="webHttpBinding" 
      bindingConfiguration="WebHttpBinding" name="Files" contract="WcfService2.IFiles" /> 
     </service> 
    </services> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="WebHttpBehavior"> 
      <webHttp defaultBodyStyle="Wrapped" defaultOutgoingResponseFormat="Json" 
      automaticFormatSelectionEnabled="false" /> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="MyServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
    <system.web> 
    <httpRuntime maxRequestLength="100000" /> 
    </system.web> 

</configuration> 

Trả lời

8

thiết bị đầu cuối mà sử dụng WebHttpBinding (aka, WCF WebHttp điểm cuối) , không để lộ siêu dữ liệu như các điểm cuối "bình thường" (ví dụ, SOAP) làm. WCF sẽ vẫn tạo WSDL cho dịch vụ của bạn (vì bạn đã chỉ định <serviceMetadata httpGetEnabled="true"/>), nhưng siêu dữ liệu sẽ chỉ chứa một số khía cạnh nhất định của dịch vụ (chẳng hạn như hợp đồng dữ liệu, v.v.). Các tính năng liên quan đến Web (thuộc tính WebInvoke/WebGet) sẽ không nằm trên proxy, vì vậy ngay cả khi bạn nhận được tệp proxy, bạn sẽ không thể sử dụng nó để giao tiếp với dịch vụ (trừ khi bạn không làm như vậy) t sử dụng bất kỳ của những người). Vấn đề là không có định dạng được chấp nhận rộng rãi để mô tả siêu dữ liệu cho các dịch vụ REST (WADL có thể được sử dụng nhiều nhất, nhưng nó gần như không phổ biến như WSDL cho SOAP và nó không được WCF thực hiện).

Tóm lại: svcutil không thực sự hoạt động cho các điểm cuối web.

Nếu bạn muốn có phiên bản dài: http://blogs.msdn.com/b/carlosfigueira/archive/2012/03/26/mixing-add-service-reference-and-wcf-web-http-a-k-a-rest-endpoint-does-not-work.aspx

+0

Điều đó không đúng. Tôi đã cố gắng thực hiện dự án đơn giản tại nhà (theo VS2008, .NET 3.5). Điểm cuối dịch vụ được cấu hình với phần tử webHttpBinding và webHttp. Lệnh svcutil.exe http: // localhost: 3065/Service1.svc? Wsdl nhận cả proxy và tệp cấu hình. – vpp

+0

Kiểm tra ràng buộc được sử dụng trong tập tin cấu hình - nó sẽ không được webHttpBinding. Có thể bạn đang nhấn một số điểm cuối mặc định trên dịch vụ. – carlosfigueira

+0

Dịch vụ chỉ có một điểm cuối. svcutil làm cho một cơ sở cho phù thủy khách hàng có quyền truy cập vào điểm cuối thông qua SOAP (messageVersion = "Soap12" của textMessageEncoding của customBinding). Và nó được mô tả trong tập tin cấu hình. Mẫu đầu tiên không có gì cả. – vpp