RESTful WCF 服务返回“找不到资源”。错误
Posted
技术标签:
【中文标题】RESTful WCF 服务返回“找不到资源”。错误【英文标题】:RESTful WCF Service returns "The resource cannot be found." error 【发布时间】:2011-08-31 11:52:14 【问题描述】:我有一个不起作用的 RESTful 服务。当我在地址栏中输入 URI 时,我收到此错误:
找不到资源。
描述:HTTP 404。您要查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。请检查以下 URL 并确保其拼写正确。
请求的 URL:/VirtualRUS/Service1.svc/
我不知道为什么它不起作用。我将我的代码和 web.config 与一个工作示例进行了比较,我找不到任何差异。
编辑:另外,如果我使用服务引用,我可以很好地使用该服务。如果我导航到 URI,或者更重要的是,当我尝试创建 WebRequest
时,它就不起作用。
有人知道为什么这不起作用吗?
Service1.cs:
[ServiceContract]
public interface IService1
[OperationContract]
[WebGet(UriTemplate = "/")]
string Test();
Service1.svc.cs:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service1 : IService1
public string Test()
return "It works!!";
Web.Config:
<?xml version="1.0" ?>
<configuration>
<configSections>
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere" />
<section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
<section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication" />
</sectionGroup>
</sectionGroup>
</sectionGroup>
</configSections>
<appSettings></appSettings>
<connectionStrings>
<add name="ResearchLibrary" connectionString="Server=XXXXXX" ; Initial Catalog=ResearchLibrary; user id=XXX; password=XXX " />
</connectionStrings>
<system.web>
<compilation debug="true ">
<assemblies>
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089 "/>
<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35 "/>
</assemblies>
</compilation>
<authentication mode="Windows "/>
<pages>
<controls>
<add tagPrefix="asp " namespace="System.Web.UI " assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35 "/>
</controls>
</pages>
<httpHandlers>
<remove verb="* " path="*.asmx "/>
<add verb="* " path="*.asmx " validate="false " type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35 "/>
<add verb="* " path="*_AppService.axd " validate="false " type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35 "/>
<add verb="GET,HEAD " path="ScriptResource.axd " type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35 " validate="false "/>
</httpHandlers>
<httpModules>
<add name="ScriptModule " type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35 "/>
</httpModules>
<httpRuntime maxRequestLength="65536 "/>
</system.web>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp " extension=".cs " warningLevel="4 " type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ">
<providerOption name="CompilerVersion " value="v3.5 "/>
<providerOption name="WarnAsError " value="false "/>
</compiler>
</compilers>
</system.codedom>
<system.web.extensions>
<scripting>
<webServices>
</webServices>
</scripting>
</system.web.extensions>
<system.webServer>
<validation validateIntegratedModeConfiguration="false "/>
<modules>
<add name="ScriptModule " preCondition="integratedMode " type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35 "/>
</modules>
<handlers>
<remove name="WebServiceHandlerFactory-Integrated "/>
<add name="ScriptHandlerFactory " verb="* " path="*.asmx " preCondition="integratedMode " type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35 "/>
<add name="ScriptHandlerFactoryAppServices " verb="* " path="*_AppService.axd " preCondition="integratedMode " type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35 "/>
<add name="ScriptResource " preCondition="integratedMode " verb="GET,HEAD " path="ScriptResource.axd " type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35 "/>
</handlers>
</system.webServer>
<system.serviceModel>
<services>
<service name="ResearchUploadService.Service1 " behaviorConfiguration="ResearchUploadService.Service1Behavior ">
<!-- Service Endpoints -->
<endpoint address="customBinding " binding="customBinding " bindingConfiguration="basicConfig " contract="ResearchUploadService.IService1 "/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ResearchUploadService.Service1Behavior ">
<serviceMetadata httpGetEnabled="true "/>
<
<serviceDebug includeExceptionDetailInFaults="true "/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<customBinding>
<binding name="basicConfig ">
<binaryMessageEncoding/>
<httpTransport transferMode="Streamed " maxReceivedMessageSize="67108864 "/>
</binding>
</customBinding>
</bindings>
</system.serviceModel>
</configuration>
【问题讨论】:
可以把Service1.svc和web.config的内容贴一下吗? 我真的不知道如何发布Service1.svc的内容。当我在解决方案资源管理器中双击它时,它会打开 Service1.svc.cs。 可以通过右键查看Service1.svc的内容,选择“查看标记” 【参考方案1】:您的端点不是 REST 端点,它是“普通”的 SOAP 端点(二进制编码/http 传输)。 REST 端点是使用特定绑定 (webHttpBinding) 和行为 (webHttp) 定义的。此外,添加服务引用不适用于 REST 端点,这也表明如果它适用于您,那么您没有使用 REST 端点。
要将您的端点更改为 RESTful,您可以更改 web.config,如下所示(它实际上在您已有的 SOAP 端点之外添加了一个 REST 端点)。
<system.serviceModel>
<services>
<service name="ResearchUploadService.Service1" behaviorConfiguration="ResearchUploadService.Service1Behavior">
<!-- Service Endpoints -->
<endpoint address="customBinding" binding="customBinding" bindingConfiguration="basicConfig" contract="ResearchUploadService.IService1"/>
<endpoint address="" binding="webHttpBinding" behaviorConfiguration="REST" contract="ResearchUploadService.IService1"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ResearchUploadService.Service1Behavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="REST">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<customBinding>
<binding name="basicConfig">
<binaryMessageEncoding/>
<httpTransport transferMode="Streamed" maxReceivedMessageSize="67108864"/>
</binding>
</customBinding>
</bindings>
</system.serviceModel>
【讨论】:
嘿,我怎么能给你 10 票 :) .. 谢谢你的解决方案以上是关于RESTful WCF 服务返回“找不到资源”。错误的主要内容,如果未能解决你的问题,请参考以下文章
Restful WCF 服务 POST 方法在 fiddler2 中返回 HTTP400 错误