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
}
MyFault
và MyDto
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.
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
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