3

这就是我所拥有的。当我尝试通过它访问我的服务时,http://localhost:55129/Cars.svc它工作正常。

当我尝试http://localhost:55129/Cars它没有。我认为路线应该允许这样做,但我显然错过了一些东西。

这是我的服务课程

[ServiceContract(Name = "Cars", Namespace = "http://localhost:53329", SessionMode = SessionMode.NotAllowed)]
public interface ICars
{
    [OperationContract(Name="Get"), WebGet(UriTemplate = "/cars",
                        BodyStyle= WebMessageBodyStyle.Wrapped,
                        RequestFormat = WebMessageFormat.Json,
                        ResponseFormat = WebMessageFormat.Json)]
    string Get();

    [OperationContract(Name = "GetById"), WebGet(UriTemplate = "/cars/?id={id}",
                        BodyStyle= WebMessageBodyStyle.Wrapped,
                        RequestFormat = WebMessageFormat.Json,
                        ResponseFormat = WebMessageFormat.Json)]
    Car Get(int id);
}

这是我的 web.config

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>

  <system.serviceModel>

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
        <serviceActivations>
            <add relativeAddress="Cars.svc" service="Sandbox.WCF.API.Cars"/>
        </serviceActivations>
    </serviceHostingEnvironment>

    <bindings>

      <!-- SOAP Binding -->
      <basicHttpBinding>
        <binding name ="soapBinding">
            <security mode="None"></security>
        </binding>
      </basicHttpBinding>

      <!-- Enable RESTful Endpoints-->
      <webHttpBinding>
        <binding name="webBinding"></binding>
      </webHttpBinding>

    </bindings>


    <behaviors>

      <endpointBehaviors>

        <!-- allow XML REST -->
        <behavior name="poxBehavior">
            <webHttp defaultOutgoingResponseFormat="Xml"/>
        </behavior>

        <!--<behavior name="jsonBehavior"><enableWebScript/></behavior>-->
        <!-- allow JSON REST -->
        <behavior name="jsonBehavior">
            <webHttp helpEnabled="true" defaultOutgoingResponseFormat="Json"/>
        </behavior>

      </endpointBehaviors>

      <serviceBehaviors>

        <behavior name="defaultBehavior">
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceMetadata httpGetEnabled="true" />
        </behavior>

      </serviceBehaviors>

    </behaviors>


    <services>

      <service name="Sandbox.WCF.API.Cars" behaviorConfiguration="defaultBehavior">
        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
        <endpoint address="soap" binding="basicHttpBinding" bindingConfiguration="soapBinding" contract="Sandbox.WCF.API.Interfaces.ICars" />
        <endpoint address="json" binding="webHttpBinding" bindingConfiguration="webBinding" behaviorConfiguration="jsonBehavior" contract="Sandbox.WCF.API.Interfaces.ICars" />
      </service>

    </services>

  </system.serviceModel>


  <system.webServer>

    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>

  </system.webServer>

</configuration>

更新 - Per Luiz 的评论

可能有一些我仍然没有做对的事情,因为它还没有工作:

  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
    <serviceActivations>
      <add relativeAddress="Cars.svc" service="OurCompany.API.Service.Cars"/>
    </serviceActivations>
  </serviceHostingEnvironment>

在我的服务项目的 global.asax

protected void Application_Start(object sender, EventArgs e)
{
    RegisterRoutes();
}

private void RegisterRoutes()
{
    RouteTable.Routes.Add(new ServiceRoute("Cars", new WebServiceHostFactory(), typeof(Cars)));
}
4

1 回答 1

0

首先,命名空间与服务地址无关,它用于 wsdl 上的 targetnamespace 和组成soap action,也可以用于在端点之间进行消息路由。

aspNetCompatibilityEnabled 将使请求通过 aspnet 管道,然后您可以使用 aspnet url rewrite 来解决您的问题。

但是您使用的是 dotnet 4.5,然后将其放在 Global.asax.cs 上,它比 url 路由模块更容易。

    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes(RouteTable.Routes);
    }

    private void RegisterRoutes(RouteCollection routes)
    {
        routes.Add(new ServiceRoute("Cars",
                   new ServiceHostFactory(), typeof(Sandbox.WCF.API.Cars)));
    }

消除了使用路由的 WCF 4 服务的 URL 中的 .svc?与您正在尝试做的事情有关。这里有一个关于这个问题的讨论ServiceRoute + WebServiceHostFactory kills WSDL generation? 如何使用 ?wsdl 创建无扩展 WCF 服务

于 2013-10-14T15:28:13.927 回答