REST风格的WCF服务返回"资源无法找到与QUOT。错误风格、错误、资源、REST

2023-09-03 20:35:47 作者:蹲犄角抽煙的侽人

我有一个不工作的RESTful服务。当我键入​​URI到地址栏,我收到此错误:

  

资源无法找到。

     

说明:HTTP 404。您正在寻找(或它的一个依赖项)可能已被移除的资源,有其名称更改,或者暂时不可用。请检查以下URL并确保其拼写正确。

     

请求的URL:/VirtualRUS/Service1.svc /

我不知道为什么它不工作。我比我的code和web.config中工作的例子,我找不到任何差异。

编辑:同时,我能够使用这项服务就好了,如果我使用一个服务引用。它只是如果我浏览不起作用的URI,或者更重要的是,当我试图做一个的WebRequest

没有人有任何想法,为什么这是行不通的?

Service1.cs:

  [的ServiceContract]
公共接口IService1
{
   [OperationContract的]
   [WebGet(UriTemplate =/)]
   字符串Test();
}
 

Service1.svc.cs:

  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)
公共类服务1:IService1
{
   公共字符串测试()
   {
      返回它的工作原理!;
   }
}
 

的Web.Config:

< XML版本=1.0&GT?; <结构>     < configSections>         < sectionGroup名=System.Web.Extensions程序TYPE =System.Web.Configuration.SystemWebExtensionsSectionGroup,System.Web.Extensions程序,版本= 3.5.0.0,文化=中性公钥= 31BF3856AD364E35>             < sectionGroup名=脚本类型=System.Web.Configuration.ScriptingSectionGroup,System.Web.Extensions程序,版本= 3.5.0.0,文化=中性公钥= 31BF3856AD364E35>                 <节名称=scriptResourceHandlerTYPE =System.Web.Configuration.ScriptingScriptResourceHandlerSection,System.Web.Extensions程序,版本= 3.5.0.0,文化=中性公钥= 31BF3856AD364E35requirePermission =假allowDefinition的=MachineToApplication/ >                 < sectionGroup名称=Web服务类型=System.Web.Configuration.ScriptingWebServicesSectionGroup,System.Web.Extensions程序,版本= 3.5.0.0,文化=中性公钥= 31BF3856AD364E35>                     <节名称=jsonSerializationTYPE =System.Web.Configuration.ScriptingJsonSerializationSection,System.Web.Extensions程序,版本= 3.5.0.0,文化=中性公钥= 31BF3856AD364E35requirePermission =假allowDefinition的=无处不在/ >                     <节名称=ProfileService的TYPE =System.Web.Configuration.ScriptingProfileServiceSection,System.Web.Extensions程序,版本= 3.5.0.0,文化=中性公钥= 31BF3856AD364E35requirePermission =假allowDefinition的=MachineToApplication/ >                     <节名称=的AuthenticationServiceTYPE =System.Web.Configuration.ScriptingAuthenticationServiceSection,System.Web.Extensions程序,版本= 3.5.0.0,文化=中性公钥= 31BF3856AD364E35requirePermission =假allowDefinition的=MachineToApplication/ >                     <节名称=roleServiceTYPE =System.Web.Configuration.ScriptingRoleServiceSection,System.Web.Extensions程序,版本= 3.5.0.0,文化=中性公钥= 31BF3856AD364E35requirePermission =假allowDefinition的=MachineToApplication/ >                 < / sectionGroup>             < / sectionGroup>         < / sectionGroup>     < / configSections>     <的appSettings>< /的appSettings>     <的ConnectionStrings>         <添加名称=ResearchLibrary的connectionString =服务器= XXXXXX;初始目录= ResearchLibrary;用户ID = XXX;密码= XXX/>      < /的ConnectionStrings>      <的System.Web>         <编译调试=真正的>             <组件>                 <添加组件=System.Core程序,版本= 3.5.0.0,文化=中性公钥= B77A5C561934E089/>                 <添加组件=System.Web.Extensions程序,版本= 3.5.0.0,文化=中性公钥= 31BF3856AD364E35/>             < /组件>         < /编译>         <身份验证模式=窗口/>         <网页>             <控制>                 <添加标签preFIX =ASP的命名空间=的System.Web.UI集结号=System.Web.Extensions程序,版本= 3.5.0.0,文化=中性公钥= 31BF3856AD364E35/>             < /控制>         < /页>         < HttpHandlers的>             <删除动词=*路径=* ASMX。/>             <加上动词=*路径=*。ASMX验证=假TYPE =System.Web.Script.Services.ScriptHandlerFactory,System.Web.Extensions程序,版本= 3.5.0.0,文化=中性公钥= 31BF3856AD364E35/>             <加上动词=*路径=* _ AppService.axd验证=假TYPE =System.Web.Script.Services.ScriptHandlerFactory,System.Web.Extensions程序,版本= 3.5.0.0,文化=中立,公钥= 31BF3856AD364E35/>             <加上动词=GET,HEAD路径=的ScriptResource.axdTYPE =System.Web.Handlers.ScriptResourceHandler,System.Web.Extensions程序,版本= 3.5.0.0,文化=中性公钥= 31BF3856AD364E35验证= 假/>         < / HttpHandlers的>         <的HttpModules>             <添加名称=ScriptModuleTYPE =System.Web.Handlers.ScriptModule,System.Web.Extensions程序,版本= 3.5.0.0,文化=中性公钥= 31BF3856AD364E35/>         < / HttpModules的>       <的httpRuntime maxRequestLength的=65536/>     < /system.web>     <系统codeDOM>         <编译器>             <编译器语言=C#; CS; CSHARPCS扩展名= warningLevel =4TYPE =Microsoft.CSharp.CSharp codeProvider,系统,版本= 2.0.0.0,文化=中性公钥= b77a5c561934e089>                 < providerOption名=CompilerVersion值=V3.5/>                 < providerOption名=warnaserror将值=FALSE/>             < /编译器>         < /编译器>     < /system.$c$cdom>     < System.Web.Extensions程序>         <脚本>             < Web服务>             < / web服务>         < /脚本>     < /system.web.extensions>     < system.webServer>         <验证validateIntegratedModeConfiguration =FALSE/>         <模块>             <添加名称=ScriptModulepreCondition =integratedModeTYPE =System.Web.Handlers.ScriptModule,System.Web.Extensions程序,版本= 3.5.0.0,文化=中性公钥= 31BF3856AD364E35/>         < /模块>         <处理>             <删除名称=WebServiceHandlerFactory集成的/>             <添加名称=ScriptHandlerFactory动词=*PATH = preCondition =integratedModeTYPE =System.Web.Script.Services.ScriptHandlerFactory,System.Web.Extensions程序,版本= 3.5* ASMX。 .0.0,文化=中性公钥= 31BF3856AD364E35/>             <添加名称=ScriptHandlerFactoryAppServices动词=*路径=* _ AppService.axdpreCondition =integratedModeTYPE =System.Web.Script.Services.ScriptHandlerFactory,System.Web.Extensions程序,版本= 3.5.0.0,文化=中性公钥= 31BF3856AD364E35/>             <添加名称=ScriptResourcepreCondition =integratedMode动词=GET,HEAD路径=的ScriptResource.axdTYPE =System.Web.Handlers.ScriptResourceHandler,System.Web.Extensions程序,版本= 3.5 .0.0,文化=中性公钥= 31BF3856AD364E35/>         < /处理器>     < /system.webServer>     < system.serviceModel>         <服务>             <服务名称=ResearchUploadService.Service1behaviorConfiguration =ResearchUploadService.Service1Behavior>                 <! - 服务端点 - >             <端点地址=customBinding绑定=customBindingbindingConfiguration =basicConfig合同=ResearchUploadService.IService1/>             < /服务>         < /服务>         <行为>             < serviceBehaviors>                 <行为NAME =ResearchUploadService.Service1Behavior>                     < serviceMetadata httpGetEnabled =真/>                     <                     < serviceDebug includeExceptionDetailInFaults =真/>                 < /行为>             < / serviceBehaviors>       < /行为>       <绑定>          < customBinding>             <绑定名称=basicConfig>                < binaryMessageEncoding />                < httpTransport transferMode =流式传输maxReceivedMessageSize =67108864/>             < /装订>          < / customBinding>       < /绑定>     < /system.serviceModel> < /结构> Restful风格wcf调用2增删改查

解决方案

您的终结点是不是一个REST端点,这是一个正常的SOAP端点(二进制编码/ HTTP传输)。 REST端点被定义与一个特异性结合(的WebHttpBinding)和行为(webHttp)。此外,添加服务引用不为REST端点的工作,这也表明,如果你的作品,那么你就没有使用REST终结点。

要改变你的终点是REST风格,你可以改变,如下所示的web.config文件(它实际上增加了一个REST端点除了SOAP其中一个你已经有了)。

 < system.serviceModel>
    <服务>
        <服务名称=ResearchUploadService.Service1behaviorConfiguration =ResearchUploadService.Service1Behavior>
            <! - 服务端点 - >

        <端点地址=customBinding绑定=customBindingbindingConfiguration =basicConfig合同=ResearchUploadService.IService1/>
        <端点地址=绑定=的WebHttpBindingbehaviorConfiguration =休息合同=ResearchUploadService.IService1/>
        < /服务>
    < /服务>
    <行为>
        < serviceBehaviors>
            <行为NAME =ResearchUploadService.Service1Behavior>

                < serviceMetadata httpGetEnabled =真/>
                < serviceDebug includeExceptionDetailInFaults =真/>
            < /行为>
        < / serviceBehaviors>
        < endpointBehaviors>
           <行为NAME =REST>
             < webHttp />
           < /行为>
        < / endpointBehaviors>
  < /行为>
  <绑定>
     < customBinding>
        <绑定名称=basicConfig>
           < binaryMessageEncoding />
           < httpTransport transferMode =流式传输maxReceivedMessageSize =67108864/>
        < /装订>
     < / customBinding>

  < /绑定>
< /system.serviceModel>
 

I have a RESTful service that doesn't work. When I type the URI into the address bar, I receive this error:

The resource cannot be found.

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. Please review the following URL and make sure that it is spelled correctly.

Requested URL: /VirtualRUS/Service1.svc/

I can't tell why its not working. I compared my code and web.config to a working example, and I can't find any differences.

EDIT: Also, I'm able to use the service just fine if I use a service reference. It just doesn't work if I navigate to the URI, or more importantly, when I try to make a WebRequest.

Does anyone have any idea why this wouldn't work?

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>

解决方案

Your endpoint isn't a REST endpoint, it's a "normal" SOAP endpoint (binary encoding / http transport). REST endpoints are defined with a specific binding (webHttpBinding) and behavior (webHttp). Also, Add Service Reference doesn't work for REST endpoints, which is also an indication that if it works for you, then you're not using a REST endpoint.

To change your endpoint to be RESTful, you can change the web.config as shown below (it actually adds a REST endpoint in addition to the SOAP one which you already have).

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