2010-01-18 35 views
12

Tôi đang cố gắng để có được tập tin svc của tôi làm việc theo IIS. Trong dự án của tôi, khi tôi nhấn F5, tôi đã làm việc với svc. Vì vậy, tôi biết mọi thứ đều ổn, phải không? Ngoại trừ IIS.WCF Cách bật siêu dữ liệu?

Tôi đang làm việc trên máy Windows XP Pro và trong IIS tôi đã thêm một thư mục ảo.

Dưới đây là mã của tôi: IcarePlanActions (dự án: A)

namespace WcfServiceLibrary 
{ 
    [ServiceContract] 
    public interface ICarePlanActions 
    { 
     [OperationContract] 
     List<string> GetAllClients(); 
    } 
} 

Chủ đầu tư: (dự án: A)

namespace WcfServiceLibrary 
{ 
    public class Client : ICarePlanActions 
    { 
     public List<string> GetAllClients() 
     { 
      List<string> clients = new List<string>(); 
      clients.Add("Hendrik de Jong"); 
      clients.Add("Miep de Berg"); 
      clients.Add("Jaap Jongeneel"); 
      clients.Add("Joop Prakman"); 
      clients.Add("Pieter Schaakman"); 

      return clients; 

     } 
    } 
} 

Web.config (Dự án: B)

<configuration> 
    <system.serviceModel> 
     <services> 
     <service behaviorConfiguration="CarePlanService.Service1Behavior" 
      name="WcfServiceLibrary.Client"> 
      <endpoint address="" binding="wsHttpBinding" contract="WcfServiceLibrary.ICarePlanActions"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
      </endpoint> 
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
     </services> 
     <behaviors> 
     <serviceBehaviors> 
      <behavior name="CarePlanService.Service1Behavior"> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
      </behavior> 
     </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 
    </configuration> 

CarePlan.svc

<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLibrary.Client" %> 

Khi tôi chạy dịch vụ này (đó là trên IIS) với wfctestclient tôi nhận được lỗi này

Error: Cannot obtain Metadata from http://localhost/CarePlanService/CarePlan.svc If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified address.

Tôi đang làm gì sai?

SOLUTION

tôi đã không nhận được dịch vụ làm việc theo IIS. Đầu tiên tôi tự tạo một thư mục ảo và trỏ đến directiry nơi có vị trí svc. Điều này không hiệu quả. Tôi không biết tại sao.

Sau đó, tôi đi đến Visual Studio và thay đổi cài đặt máy chủ (chuột phải vào dự án, tài sản, tab Web, nhấp Use local IIS Web Server và nhấp Create Virtual Directory. Khi tôi đã làm điều này, nó làm việc dưới IIS với đoạn code trên.

+0

Tiêu đề đã chỉnh sửa - điều này không liên quan gì đến ngôn ngữ lập trình C#. –

+1

Tôi đã không sử dụng WCF như thế này nhưng bạn nên đặt thực hiện dịch vụ của bạn bên trong datacontract? và nếu có, không có datamember được định nghĩa trong hợp đồng. Chỉ có vẻ kỳ lạ với tôi. Nhưng tôi đã không bao giờ được lưu trữ trong IIS ... – magnus

+0

@ Martart: thực sự ngớ ngẩn câu hỏi: khi bạn đang cố gắng để kết nối bằng cách sử dụng WcfTestClient, là trang web lên? Nếu bạn thực hiện các thay đổi được đề xuất ở đây (hãy thả [DataContract], sử dụng "mexHttpBinding" cho điểm cuối mex), tôi không gặp vấn đề gì khi nhận siêu dữ liệu. Nhưng trước tiên bạn phải thực hiện "Xem trong trình duyệt" trên tệp * .svc, để khởi chạy máy chủ web tích hợp - và sau đó bạn có thể kết nối với URL bằng WcfTestClient –

Trả lời

5

SOLUTION

tôi đã không nhận được dịch vụ làm việc theo IIS. Đầu tiên tôi tự tạo một thư mục ảo và trỏ đến directiry nơi có vị trí svc. Điều này không hiệu quả. Tôi không biết tại sao.

Sau đó, tôi đã đi đến Visual Studio và thay đổi thiết đặt máy chủ (chuột phải vào dự án, thuộc tính, tab Web, bấm Sử dụng máy chủ Web cục bộ IIS và bấm Tạo thư mục ảo.Khi tôi đã làm điều này, nó làm việc theo IIS với mã ở trên.

+0

điều này làm việc cho tôi, vì vậy có nghĩa là nó hoạt động trong máy chủ IIS nhưng không phải trong máy chủ phát triển Visual Studio. Bạn biết tại sao mà? – superachu

2

bạn tham khảo hợp đồng dữ liệu như việc thực hiện dịch vụ. Đó là không hợp lệ.

[DataContract] 
public class Client : ICarePlanActions 
{ 

<service behaviorConfiguration="CarePlanService.Service1Behavior" 
     name="WcfServiceLibrary.Client"> 

Thay đổi này để tham khảo việc thực hiện các dịch vụ của bạn! gì việc thực hiện dịch vụ của bạn trông như thế nào?

Có lẽ bạn chỉ cần loại bỏ thuộc tính DataContract từ lớp Client. Ngoài ra đây không phải là "khách hàng" của bạn, nó là việc thực hiện các dịch vụ.

+0

Tôi đã chỉnh sửa điểm bắt đầu của mình. Đó có phải là ý bạn không? – Martijn

+0

Có. Đó là điều tôi muốn nói. – Alex

6

Trước tiên, hãy xóa thuộc tính [DataContract] trong Máy khách.

Sau đó, biên dịch lại và đảm bảo rằng bạn có WcfServiceLibrary.dll trong thư mục/bin cho thư mục ảo của bạn.

cấu hình của bạn nên sử dụng thiết bị đầu cuối này cho metadataexchange:

<endpoint address="mex" 
    binding="mexHttpBinding" 
    contract="IMetadataExchange"/> 
+0

Tôi đã thay đổi các tệp của mình, nhưng tôi vẫn không làm cho nó hoạt động. Tôi đã sửa đổi startpost của tôi với những thay đổi. – Martijn

0
  1. Run "\%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -i

  2. Hủy bỏ thư mục ảo và tạo ra nó một lần nữa.

0

Chỉ cần kiểm tra tên dịch vụ trong Service.svc tập tin

<ServiceHost Language="C#" Debug="true" Service="SvcCalculator.**Calculator**" 
      CodeBehind="**Calculator.svc.cs**" %> 

Hy vọng nó sẽ làm việc.

0

Đảm bảo rằng bạn dịch vụ namespace và dịch vụ lớp tên tương ứng với các tập tinApp.config.

<system.serviceModel> 
    <services> 
    <service name="WcfCustomLibrary.Service1"> 
    <host> 
     <baseAddresses> 
     <add baseAddress = "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary/Service1/" /> 
     </baseAddresses> 
    </host> 
    </service> 
    </services> 
</system.serviceModel> 


namespace WcfCustomLibrary 
{ 
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in both code and config file together. 
public class Service1 : IService1 
{ 
Các vấn đề liên quan