通过代理服务器连接到WCF服务时出现奇怪的异常

时间:2010-06-15 19:09:24

标签: wcf wcf-client

以下情况发生异常“相对URI不支持此操作。”:

我有一个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是两个标有[DataContract]属性的非常简单的类,每个类只有三个[DataMember]类型string, int and int?

此服务在Win 2008 Server上的IIS 7.0中与ASP.NET应用程序一起托管。我正在使用SVC文件MyService.svc,它直接位于网站的根目录中。 web.config中的服务配置如下:

<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>

这似乎可行,因为我可以在浏览器中输入地址http://www.domain.com/MyService.svc并获取“这是Windows Communication Foundation服务” - 欢迎页面。

使用该服务的客户之一是控制台应用程序:

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

它具有以下配置:

<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>

当我在客户站点的生产服务器上运行此应用程序时,调用aChannel.MyOperation(1)会引发以下异常:

相对URI不支持此操作。

当我在具有完全相同配置的开发PC上运行此客户端应用程序时,除了从绑定中删除proxyAddress="10.20.30.40:8080"之外,该操作可以正常运行。

现在我真的不知道指定代理服务器地址可能与绝对或相对URI有什么关系。是否使用代理服务器是我在生产或开发机器上运行客户端时可以看到的唯一区别。

是否有人知道此异常在此上下文中可能意味着什么以及如何解决问题?

提前感谢您的帮助!

修改

如果它很重要:服务和客户端是使用 .NET Framework 4 中的WCF构建的。

1 个答案:

答案 0 :(得分:8)

10.20.30.40:8080不是有效的网址。你想要http://10.20.30.40:8080


这是我的诊断思维过程,以防万一:

  1. 例外情况通常不是谎言。它们通常意味着他们所说的。诀窍是要了解他们如何说实话。
  2. 异常说,“相对URI不支持此操作”。如果这是真的,则意味着正在执行操作,它被赋予相对URL,但它不支持相对URI。
  3. 然后OP说当他运行应用程序时“除了我从绑定中删除proxyAddress =”10.20.30.40:8080“。
  4. 在我面前,是一个相对的URI。当他删除它时,“操作”起作用,所以我推断这是提供给不支持它们的“操作”的相对URI。

    你并不一定要成为福尔摩斯来解决这个问题。关键是能够立即看到URI前面没有scheme://,使其相对。