2010-06-15 38 views
5

Trường hợp ngoại lệ "Thao tác này không được hỗ trợ cho một URI tương đối." Xảy ra trong tình huống sau đây:ngoại lệ Strange khi kết nối với một dịch vụ WCF thông qua một máy chủ proxy

Tôi có một dịch vụ WCF:

[ServiceContract(ProtectionLevel=ProtectionLevel.None)] 
public interface IMyService 
{ 
    [OperationContract] 
    [FaultContract(typeof(MyFault))] 
    List<MyDto> MyOperation(int param); 

    // other operations 
} 

public class MyService : IMyService 
{ 
    public List<MyDto> MyOperation(int param) 
    { 
     // Do the business stuff and return a list of MyDto 
    } 

    // other implementations 
} 

MyFaultMyDto hai lớp rất đơn giản được đánh dấu bằng [DataContract] thuộc tính và mỗi chỉ có ba [DataMember] loại string, int and int?.

Dịch vụ này được lưu trữ trong IIS 7.0 trên máy chủ Win 2008 cùng với ứng dụng ASP.NET. Tôi đang sử dụng tệp SVC MyService.svc được đặt trực tiếp trong thư mục gốc của trang web. Cấu hình dịch vụ trong web.config như sau:

<system.serviceModel> 
    <services> 
    <service name="MyServiceLib.MyService"> 
     <endpoint address="" binding="wsHttpBinding" 
      bindingConfiguration="wsHttpBindingConfig" 
      contract="MyServiceLib.IMyService" /> 
    </service> 
    </services> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="wsHttpBindingConfig"> 
     <security mode="None"> 
      <transport clientCredentialType="None" /> 
     </security> 
     </binding> 
    </wsHttpBinding> 
    </bindings> 
    <behaviors> 
    <serviceBehaviors> 
     <behavior> 
     <serviceMetadata httpGetEnabled="false"/> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

Điều này dường như làm việc cho đến nay như tôi có thể nhập địa chỉ http://www.domain.com/MyService.svc trong một trình duyệt và nhận được "Đây là một Windows Communication Foundation Service" -Welcome trang.

Một trong những khách hàng tiêu thụ các dịch vụ là một ứng dụng giao diện điều khiển:

MyServiceClient aChannel = new MyServiceClient("WSHttpBinding_IMyService"); 
List<MyDto> aMyDtoList = aChannel.MyOperation(1); 

Nó đã cấu hình như sau:

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="WSHttpBinding_IMyService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="true" transactionFlow="false" 
      hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="false" 
      proxyAddress="10.20.30.40:8080" allowCookies="false"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" 
       maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" 
       enabled="false" /> 
      <security mode="None"> 
      <transport clientCredentialType="Windows" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="Windows" 
       negotiateServiceCredential="true" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://www.domain.com/MyService.svc" binding="wsHttpBinding" 
      bindingConfiguration="WSHttpBinding_IMyService" 
      contract="MyService.IMyService" 
      name="WSHttpBinding_IMyService" /> 
    </client> 
</system.serviceModel> 

Khi tôi chạy ứng dụng này tại một máy chủ sản xuất tại một trang web khách hàng gọi aChannel.MyOperation(1) ném ngoại lệ sau:

Thao tác này không được hỗ trợ cho URI tương đối.

Khi tôi chạy ứng dụng này client trên máy tính phát triển của tôi với chính xác cùng một cấu hình, với ngoại lệ mà tôi có thể ngưng proxyAddress="10.20.30.40:8080" từ bindings hoạt động hoạt động mà không vấn đề.

Bây giờ tôi thực sự không biết điều gì chỉ định địa chỉ máy chủ proxy có thể phải thực hiện với URI tuyệt đối hoặc tương đối. Việc sử dụng máy chủ proxy hay không là sự khác biệt duy nhất tôi có thể thấy khi chạy máy khách trên sản xuất hoặc trên máy phát triển.

Có ai có ý tưởng ngoại lệ này có thể có ý nghĩa gì trong ngữ cảnh này và cách giải quyết vấn đề này không?

Cảm ơn bạn đã trợ giúp!

Edit:

Trong trường hợp nó nên quan trọng: dịch vụ và khách hàng được xây dựng với WCF trong .NET Framework 4.

Trả lời

8

10.20.30.40:8080 không phải là URL hợp lệ. Bạn muốn http://10.20.30.40:8080.


Dưới đây là quá trình suy nghĩ chẩn đoán của tôi, trong trường hợp nó giúp mọi người:

  1. Exceptions thường không nói dối. Chúng thường có nghĩa là chính xác những gì họ nói. Bí quyết là hiểu cách họ có thể nói sự thật.
  2. Ngoại lệ cho biết, "Thao tác này không được hỗ trợ cho URI tương đối". Nếu điều đó đúng, thì điều đó có nghĩa là một hoạt động đã được thực hiện, nó đã được đưa ra một URL tương đối, nhưng nó không hỗ trợ các URI tương đối.
  3. OP sau đó nói rằng khi anh ta chạy ứng dụng "ngoại trừ việc tôi xóa proxyAddress =" 10.20.30.40:8080 "khỏi các ràng buộc".

Có, trước mặt tôi, là một URI tương đối. Khi anh ta gỡ bỏ nó, "hoạt động" làm việc, vì vậy tôi suy luận rằng đây là URI tương đối được cung cấp cho "hoạt động" không hỗ trợ chúng.

Bạn không chính xác phải là Sherlock Holmes để giải quyết vấn đề này. Điều quan trọng là có thể ngay lập tức thấy rằng không có scheme:// ở phía trước của URI, làm cho nó tương đối.

+0

Wow! Một câu hỏi dài hàng ngàn trang, một dòng câu trả lời và bạn nhấn móng tay. Chỉ cần kiểm tra, công trình, đánh dấu là câu trả lời. Tôi giấu trong sự xấu hổ. Dù sao đi nữa: Tốt mà tôi đã hỏi. Cảm ơn nhiều! (Edit: Lol, "bạn có thể chấp nhận một câu trả lời trong 2 phút", bạn đã quá nhanh. Chờ bây giờ 2 phút ...) – Slauma

+1

Slauma, nó rất tốt mà bạn đã hỏi!)) Bởi vì tôi đã bị bắt trong tình huống rất giống nhau. Lý do tại sao URL proxy được sử dụng mà không có "http: //" trong trường hợp của tôi là nó được sao chép từ một vị trí khác (tham số tới wget.exe), nơi nó là một cú pháp hợp lệ. – Ivan

Các vấn đề liên quan