2009-11-01 38 views
11

Tôi tạo ra một WCF Serice mà làm việc tốt khi được lưu trữ trên IIS.Invalid Exception Exception

bây giờ, tôi đã cùng một dịch vụ, và tạo ra một ứng dụng máy chủ trong WPF, và khi cố gắng để bắt đầu dịch vụ từ ứng dụng đó, tôi nhận được ngoại lệ này:

The HttpGetEnabled property of ServiceMetadataBehavior is set to true and the 
HttpGetUrl property is a relative address, but there is no http base address. 
Either  supply an http base address or set HttpGetUrl to an absolute address. 
+0

mã của bạn để tạo ra các proxy là gì? – Dani

+0

productsServiceHost = new ServiceHost (typeof (Products.ProductsService)); productsServiceHost.Open(); stop.IsEnabled = true; start.IsEnabled = false; trạng thái.Text = "Dịch vụ đang chạy ..."; – Attilah

Trả lời

22

Lỗi này là khá rõ ràng - bạn đang sử dụng HTTP, bạn đã bật HttpGetEnabled trên hành vi ServiceMetadata của mình, nhưng bạn chưa cung cấp địa chỉ cơ sở trong cấu hình của mình.

Trong IIS, địa chỉ cơ sở là không cần thiết, cũng không được sử dụng, vì vị trí của tệp * .svc xác định địa chỉ dịch vụ của bạn. Khi bạn tự lưu trữ, bạn có thể và nên sử dụng địa chỉ cơ sở.

Thay đổi cấu hình của bạn để tìm một cái gì đó như thế này:

<system.serviceModel> 
    <services> 
    <service name="YourService"> 
     <host> 
     <baseAddresses> 
      <add baseAddress="http://localhost:8080/YourService" /> 
     </baseAddresses> 
     </host> 
     <endpoint address="mex" binding="mexHttpBinding" 
       contract="IMetadataExchange" /> 
     ..... (your own other endpoints) ........... 
    </service> 
    </services> 
</system.serviceModel> 

Bây giờ, "HttpGetEnabled" có một địa chỉ cơ sở http://localhost.8080/YourService đến để có được những siêu dữ liệu từ.

Hoặc nếu bạn không thích điều này, một lần nữa, thông báo lỗi là khá rõ ràng về sự thay thế của bạn: xác định một URL tuyệt đối cho HttpGetUrl trong ServiceMetadata của bạn:

<serviceBehaviors> 
    <behavior name="Default"> 
     <serviceMetadata 
      httpGetEnabled="true" 
      httpGetUrl="http://localhost:8282/YourService/mex" /> 
    </behavior> 
    </serviceBehaviors> 

Các khách hàng có thể nhận được siêu dữ liệu của bạn từ các điểm cuối "mex" của bạn, hoặc tại một URL cố định được định nghĩa như trong ví dụ thứ hai này, hoặc chúng sẽ đi đến địa chỉ cơ sở của dịch vụ cho siêu dữ liệu (nếu có).

Nếu bạn đến từ IIS và không điều chỉnh bất cứ thứ gì, bạn sẽ không có địa chỉ cơ sở cũng như URL tuyệt đối, rõ ràng cho điểm cuối trao đổi Siêu dữ liệu của bạn, vì vậy đó là lý do bạn gặp lỗi .

Marc

+1

Tôi đã kết thúc ở đây với cùng một vấn đề, nhưng không phải vì tôi không biết phải làm gì. Thay vào đó, tôi không biết phải tìm gì để thêm "địa chỉ cơ sở" vào cấu hình của mình. Bạn đã sử dụng tài nguyên nào để xác định sự tồn tại và cú pháp của thuộc tính '' và ''? – Matt

0

tôi phải đối mặt với lỗi này khi tôi cố gắng sử dụng net.pipe binding.In trường hợp của tôi, hành vi dịch vụ mặc định công bố siêu dữ liệu dịch vụ, Đây là nguyên nhân gây ra lỗi của tôi. Giải pháp của tôi là sử dụng hành vi khác nhau cho các dịch vụ của bạn. , sau đó tôi đã thay đổi tệp cấu hình của mình theo câu trả lời @marc_s và thực hiện các hành vi dịch vụ khác nhau như sau:

<serviceBehaviors> 
     <!--Default behavior for all services (in my case net pipe binding)--> 
     <behavior > 

      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" /> 

      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     <!--for my http services --> 
     <behavior name="MyOtherServiceBehavior"> 

      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 

      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
0

Kiểm tra lớp dịch vụ là chính xác.

Nó giải quyết vấn đề của tôi

// Create a ServiceHost for the CalculatorService type and 
// provide the base address. 
serviceHost = new ServiceHost(typeof(ServiceClass));