【问题标题】:WCF RESTful Service not picking up on /xml/string uri - 404 errorWCF RESTful 服务未在 /xml/string uri 上启动 - 404 错误
【发布时间】:2015-11-19 01:07:36
【问题描述】:

我在 MVC 应用程序中有一个 WCF 服务,但它没有按我的预期工作。

我的 IService.cs 代码如下:

[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebInvoke(Method = "GET",

        // Set output to XML and the text display to wrap
        ResponseFormat = WebMessageFormat.Xml,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "xml/{name}")]
    string XMLData(string name);

    [OperationContract]
    [WebInvoke(Method = "GET",

        // Set output to JSON and the text display to wrap
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "json/{name}")]
    string JSONData(string name);
}

我的 Service.svc 代码是:

    public class Service : IService
{
    #region IService Members

    public string XMLData(string name)
    {
        return "Hello " + name;
    }

    public string JSONData(string name)
    {
        return "Hello " + name;
    }
    #endregion
}

当我转到 localhost/Service.svc 时,我得到了我期望的页面。但是,当我转到 localhost/Service.svc/xml/Tim(或 /json/)时,我收到 404 - resource cannot be found 错误。

我很肯定我的 Web.config 文件也配置正确,但如果有人认为这是问题所在,我可以发布该文件(所有 MVC 内容有点臃肿)。

对造成这种情况的原因有什么想法吗?谢谢!

编辑:这是我的完整 Web.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
   </configSections>
   <connectionStrings>
   <add name="DefaultConnection" connectionString="Data Source= (LocalDb)\v11.0;Initial Catalog=aspnet-FinalProjectGuitar-20151110211739;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-FinalProjectGuitar-20151110211739.mdf" providerName="System.Data.SqlClient" />
   </connectionStrings>
<appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
<system.web>
  <compilation debug="true" targetFramework="4.5" />
  <httpRuntime targetFramework="4.5" />
  <authentication mode="Forms">
    <forms loginUrl="~/Account/Login" timeout="2880" />
  </authentication>
  <pages>
    <namespaces>
    <add namespace="System.Web.Helpers" />
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization" />
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.WebPages" />
  </namespaces>
</pages>
</system.web>
<system.webServer>
  <validation validateIntegratedModeConfiguration="false" />
<handlers>
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers></system.webServer>
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780ccd10d57b246" />
      <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.1.0.0" />
    </dependentAssembly>
    <dependentAssembly>
    <assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780ccd10d57b246" />
    <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.1.0.0" />
    </dependentAssembly>
    <dependentAssembly>
    <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="1.0.0.0-1.3.0.0" newVersion="1.3.0.0" />
  </dependentAssembly>
</assemblyBinding>
</runtime>
<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="v11.0" />
    </parameters>
  </defaultConnectionFactory>
</entityFramework>
<system.serviceModel>
  <bindings>
    <webHttpBinding>
      <binding name="WebxmlHttp">
        <security mode="None"/>
      </binding>
      <binding name="WebjsonHttp">
        <security mode="None"/>
      </binding>
    </webHttpBinding>
  </bindings>
  <services>
    <service behaviorConfiguration="ServiceBehavior" name="FinalProjectGuitar.Service">
      <endpoint address="xml" behaviorConfiguration="xmlBehavior" binding="webHttpBinding"
      bindingConfiguration="WebxmlHttp" name="webXMLHttpBinding" contract="FinalProjectGuitar.IService" />
      <endpoint address="json" behaviorConfiguration="jsonBehavior" binding="webHttpBinding"
      bindingConfiguration="WebjsonHttp" name="webJSONHttpBinding" contract="FinalProjectGuitar.IService" />
    </service>
  </services>
  <behaviors>
    <endpointBehaviors>
    <behavior name="jsonBehavior">
      <webHttp defaultOutgoingResponseFormat="Json"/>
      </behavior>
      <behavior name="xmlBehavior">
        <webHttp defaultOutgoingResponseFormat="Xml"/>
      </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
      <behavior name="ServiceBehavior">
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <protocolMapping>
    <add binding="basicHttpsBinding" scheme="https" />
  </protocolMapping>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
  multipleSiteBindingsEnabled="true" />
</system.serviceModel>
</configuration>

【问题讨论】:

  • 你能去localhost/Service.svc?wsdl吗?
  • 是的,我可以。我可以在那里看到 XMLData 和 JSONData 操作

标签: c# xml wcf rest


【解决方案1】:

我将与您分享我的配置,因为它背后的服务已经不间断地运行了两年,没有出现任何问题,返回 pox、json 和 soap。我敢打赌这是服务端点配置中的东西。

顺便说一句:我认为您不必在 uri 模板(json/xml)中指定端点行为。这更适用于参数匹配类型的东西,imo。

[OperationContract()]
[WebGet(UriTemplate = "GetData/{aParam1}/{aParam2}")]
MyResponse GetData(string aParam1, string aParam2);

web.config

  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="WebxmlHttp">
          <security mode="None"/>
        </binding>
        <binding name="WebjsonHttp">
          <security mode="None"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="SecureServiceBehavior" name="XXXX.XXXX.Services.Reporting.ServiceImplementation.XXXX">
        <clear />
        <endpoint address="xml" behaviorConfiguration="xmlBehavior" binding="webHttpBinding"
          bindingConfiguration="WebxmlHttp" name="webXMLHttpBinding" contract="XXXX.XXXX.Services.Reporting.ServiceContracts.XXXX" />
        <endpoint address="json" behaviorConfiguration="jsonBehavior"
          binding="webHttpBinding" bindingConfiguration="WebjsonHttp"
          name="webJSONHttpBinding" contract="XXXX.XXXX.Services.Reporting.ServiceContracts.IXXXXX" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="jsonBehavior">
          <webHttp defaultOutgoingResponseFormat="Json"/>
        </behavior>
        <behavior name="xmlBehavior">
          <webHttp defaultOutgoingResponseFormat="Xml"/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="SecureServiceBehavior">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <dataContractSerializer ignoreExtensionDataObject="true" maxItemsInObjectGraph="2147483647"/>
          <serviceTimeouts transactionTimeout="00:03:00"/>
          <serviceThrottling maxConcurrentCalls="10" maxConcurrentSessions="10" maxConcurrentInstances="10"/>
        </behavior>
      </serviceBehaviors>
    </behaviors> 
  </system.serviceModel>

【讨论】:

  • 嗯,我添加了你的一些代码。我没有针对 xml 和 json 的单独行为,但这并没有解决它。仍然出现同样的错误。
  • 如果还是 404 那就是服务端点问题,或者是路由找不到 web 服务方法签名。您是否使用 DataContracts 进行回复?另外,您是否将预期的参数添加到您的网址? -- localhost/Service.svc/xml/Tim/valueforNameParam
  • 我没有使用 DataContracts。我不太确定那些是什么,但我在谷歌搜索时看到了它们。这是我与 Web 服务的第一次交互,所以对我来说有点新鲜。奇怪的是,我在 WCF Web 服务应用程序中使用了完全相同的代码,它运行良好。然后我尝试使用相同的代码并将 WCF Webservice 添加到我的 MVC 项目中,但它不起作用。
  • 您正在指定一个 {name} 参数,您是否将其作为 url 的一部分传递?
  • 是的,我想是的。这就是 localhost/Service.svc/xml/Tim 中的“Tim”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
相关资源
最近更新 更多