无法创建相对 URI,因为 'uriString' 参数表示绝对 URI

Posted

技术标签:

【中文标题】无法创建相对 URI,因为 \'uriString\' 参数表示绝对 URI【英文标题】:A relative URI cannot be created because the 'uriString' parameter represents an absolute URI无法创建相对 URI,因为 'uriString' 参数表示绝对 URI 【发布时间】:2015-02-22 18:15:33 【问题描述】:

我创建了一个简单的 WCF 服务,它托管在网络场上。现在,当我 sometimes 使用 http://www.example.com/somefolder/file.svc 在浏览器中加载服务时,出现以下错误。如果我按 F5 几次,则页面最终会再次出现。

更新 1: 我注意到,即使我使用单个 Web 服务器的 IP 在浏览器中加载 svc,有时我也会收到相同的错误消息,有时它可以工作。

无法创建相对 URI,因为 'uriString' 参数 代表一个绝对URI。http://www.example.com/somefolder/file.svc

[UriFormatException: A 无法创建相对 URI,因为 'uriString' 参数 代表一个绝对的 URI.http://www.example.com/somefolder/file.svc] System.ServiceModel.Activation.ApplyHostConfigurationBehavior.ThrowIfAbsolute(Uri 乌里)+154 System.ServiceModel.Activation.ApplyHostConfigurationBehavior.FailActivationIfEndpointsHaveAbsoluteAddress(ServiceHostBase 服务)+128 System.ServiceModel.Activation.ApplyHostConfigurationBehavior.System.ServiceModel.Description.IServiceBehavior.Validate(ServiceDescription 描述,ServiceHostBase 服务)+65 System.ServiceModel.Description.DispatcherBuilder.ValidateDescription(ServiceDescription 描述,ServiceHostBase serviceHost) +161 System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription 描述,ServiceHostBase serviceHost) +84 System.ServiceModel.ServiceHostBase.InitializeRuntime() +37 System.ServiceModel.ServiceHostBase.OnBeginOpen() +27 System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan 超时) +49 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度 超时)+261 System.ServiceModel.HostingManager.ActivateService(字符串 标准化虚拟路径)+121 System.ServiceModel.HostingManager.EnsureServiceAvailable(字符串 normalizedVirtualPath) +479

[ServiceActivationException: 服务 '/somefolder/file.svc' 不能 由于编译过程中的异常而被激活。例外 消息是:无法创建相对 URI,因为“uriString” 参数代表一个绝对值 URI.http://www.example.com/somefolder/file.svc.] System.ServiceModel.AsyncResult.End(IAsyncResult 结果) +11653822 System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult 结果)+194 System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication 上下文,布尔流上下文)+176 System.ServiceModel.Activation.HttpHandler.ProcessRequest(HttpContext 上下文)+23 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

我不确定是什么原因造成的。就像我说的,我只是在加载服务。 我也没有在我的代码中使用任何 URI。 Web 服务托管在三台使用 IIS7.5 的服务器上,并全部指向包含 wcf 文件的共享驱动器。

这是来自 web.config 的部分:

<!-- Configuration For File.svc -->
    <system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

        <services>
            <service behaviorConfiguration="WebFileService.FileBehavior" name="WebFileService.File">
                <endpoint address="http://www.example.com/somefolder/file.svc" binding="wsHttpBinding" contract="WebFileService.IFile" bindingConfiguration="WSHttpBinding_IFile">
                    <identity>
                        <dns value="localhost" />
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="WebFileService.FileBehavior">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="true" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IFile" closeTimeout="00:01:00" openTimeout="00:01:00"
                    receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"
                    transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="1000000"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="99999" maxArrayLength="999999"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
                        <message clientCredentialType="None" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="true"/>
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
    </system.serviceModel>

【问题讨论】:

你检查过你的 web.config 文件了吗? web.config 对我来说看起来不错。我已经使用配置中的服务部分编辑了我的问题。 负载均衡器是否可能并不总是传递完整的 URL?也许这是某个地方的设置?很可能不会,但永远不会知道。 我不能检查这个。有什么想法吗? 很抱歉,我没有任何建议,但想分享一下,我在 WCF 数据服务上也看到了这种行为。多年来,该服务在共享 Web 主机上的生产环境中一直运行良好,但为了准备进行一些站点更新,我一直将站点移至 Azure Web 应用程序。当我在本地运行该服务时,在 IIS Express(VS 2015 RC,刚刚作为网站打开)中的 localhost 上,该服务工作正常,但在 Azure Web App 中它失败并显示您看到的错误消息。 【参考方案1】:

我刚刚遇到了同样的问题,并修复了它,我将端点设置为端点节点上的相对地址(我删除了地址属性值,使其成为空字符串 - address="")。我的 .svc 位于从 URL 调用的路径中,因此空地址不是问题。

我也没有使用身份节点,但我确实将 multipleSiteBindingsEnabled 设置为 true。

【讨论】:

以上是关于无法创建相对 URI,因为 'uriString' 参数表示绝对 URI的主要内容,如果未能解决你的问题,请参考以下文章

浏览器URL中 encodeURIComponent()加密和decodeURIComponent()解码

js中decodeURI()和encodeURI()区别,decodeURIComponent和encodeURIComponent区别

相对路径获取项目文件 及报错 No mapping found for HTTP request with URI XXX in DispatcherServlet with name ‘spring

Apache VFS 错误。因为它是相对路径,并且没有提供基本 URI

Android - 从 Uri 到 InputStream 再到字节数组?

Windows无法创建对象 因为 目录服务无法分配相对标识符