将新WCF服务添加到现有项目

时间:2015-10-19 15:34:46

标签: c# wcf

我正在为项目添加新的WCF服务,但新项目与旧项目的行为不同。

每个都有一个类似的SVC文件:

library(grid)
library(gridExtra)

# example data & header row
tab <- tableGrob(mtcars[1:3, 1:4], rows=NULL)
header <- tableGrob(mtcars[1, 1:2], rows=NULL, cols=c("head1", "head2")) 

jn <- combine(header[1,], tab, along=2)
jn$widths <- rep(max(jn$widths), length(jn$widths)) # make column widths equal
#grid.newpage()
#grid.draw(jn) # see what it looks like before altering gtable

# change the relevant rows of gtable
jn$layout[1:4 , c("l", "r")] <- list(c(1, 3), c(2, 4))

grid.newpage()
grid.draw(jn)

每个都有一个定义ServiceContract和OperationContracts的接口:

<%@ ServiceHost Language="C#" Debug="true" Service="Company.Project.Service1"  %>

每个都在web.config文件中定义:

[ServiceContract]
[ServiceKnownType(typeof(Service1))]
public interface IService1
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "json/method1", RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
    ResponseObject Method1(RequestObject req);
}

但是,当我使用Chrome浏览器在我的一个预生产环境中访问原始服务的网址时,我看到了我期望的“方法不允许”错误(因为我正在使用GET)。

当我访问新服务时,收到404错误:

  <service name="Company.Project.Service1" behaviorConfiguration="ServiceBehavior">
    <endpoint address="rest" binding="webHttpBinding" contract="Company.Project.IService1" behaviorConfiguration="web"/>
    <endpoint address="soap" binding="basicHttpBinding" contract="Company.Project.IService1"/>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  </service>

另一个奇怪的是它在我之前的预生产环境中有效,所以它可能只是部署过程中的一部分。

2 个答案:

答案 0 :(得分:1)

我发现你的方法叫做Method1,但是你试图进入method2

您的网络配置是否还有针对endpointBehavior的部分,如下所示。您需要它来为您的webHttpBinding启用REST端点。您可能应该添加服务行为

<behaviors>
  <endpointBehaviors>
    <behavior name="web">
      <webHttp/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="web">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

答案 1 :(得分:1)

确保您在Global.asax文件中为已在现有项目中添加的新服务定义了路由。这可能很容易被遗漏,导致无法通过托管环境中的Asp.net pipline找到资源。

因此,如果您有新版本的服务,请说ApiService2,您需要添加如下条目:

routes.Add(new ServiceRoute("api2", new ServiceHostFactory(), typeof(ApiService2)));