WCF 服务在本地而非服务器 IIS 上工作以获取功能

Posted

技术标签:

【中文标题】WCF 服务在本地而非服务器 IIS 上工作以获取功能【英文标题】:WCF service working on local not server IIS for functions 【发布时间】:2019-09-09 03:36:39 【问题描述】:

我有一个基本的 WCF 服务位于服务器 IIS 上,SQL 数据库也位于它上面。

当我在本地运行它时,它工作正常,我的所有服务功能都可以工作,但是一旦我发布到服务器 IIS,我就会得到

The server encountered an error processing the request. Please see the service help page for constructing valid requests to the service.

仅当我调用 /function 时

如果我只是转到起始页面,我会找不到终点,这在我的本地是一样的。

这是我的 service.svc 的样子

using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Activation;
using System.Web.Script.Services;
using Newtonsoft.Json.Linq;

namespace myNameSpace

    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Service
    


        /// <summary>
        /// ....
        /// </summary>
        /// <returns>string</returns>
        [WebInvoke(UriTemplate = "/NextWeek", Method = "GET")]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string nextWeek()
        
            return db.Instance.getNextWeek();
        

        //this continues for awhile and is basically the same type of functions

    

我还创建了一个 global.asax

   public class Global : HttpApplication
    
        void Application_Start(object sender, EventArgs e)
        
            RouteTable.Routes.Add(new ServiceRoute("", new WebServiceHostFactory(), typeof(Service)));
        
    

这是我的 web.config

我最初遇到 404 错误,但我已设法将其解决到表明我的服务没有终点的地方。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!--
    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.

    The following attributes can be set on the <httpRuntime> tag.
      <system.Web>
        <httpRuntime targetFramework="4.5" />
      </system.Web>
  -->
  <system.web>
    <compilation targetFramework="4.6" />
    <pages controlRenderingCompatibilityVersion="4.0" />
  </system.web>
  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <standardEndpoints>
      <webHttpEndpoint>
        <!-- 
            Configure the WCF REST service base address via the global.asax.cs file and the default
            endpoint via the attributes on the <standardEndpoint> element below
        -->
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" />
      </webHttpEndpoint>
    </standardEndpoints>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <!-- 
              To avoid disclosing metadata information, set the value below to false and remove the
              metadata endpoint above before deployment 
          -->
          <serviceMetadata httpGetEnabled="true" />
          <!-- 
              To receive exception details in faults for debugging purposes, set the value below to 
              true.  Set to false before deployment to avoid disclosing exception information 
          -->
          <serviceDebug includeExceptionDetailInFaults="true" />

        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
  <connectionStrings>
    .....
  </connectionStrings>
</configuration>

我在微软网站上找到的配置尝试了几个不同的选项,但没有帮助。

谢谢。

【问题讨论】:

你是通过 IIS 发送 json 吗? 请使用 WCF 跟踪,docs.microsoft.com/en-us/dotnet/framework/wcf/diagnostics/… 【参考方案1】:

我注意到您使用 ORM 框架来返回数据库条目。如果服务在本地而不是服务器上正常工作,在我看来是数据库连接有问题,尝试检查连接字符串,避免使用windows集成安全连接数据库。 此外,这是我关于托管 Restful 风格 wcf 服务的代码 sn-ps。服务器(wcf 服务应用程序)

[OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json)]
    Product GetProduct(int ID);
    public Product GetProduct(int ID)
    
        TestStoreEntities entities = new TestStoreEntities();
        return entities.Products.FirstOrDefault(x => x.Id == ID);
    

配置。

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior>
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="webHttpBinding" scheme="http" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

连接字符串。

<connectionStrings><add name="TestStoreEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=10.157.18.36;initial catalog=TestStore;persist security info=True;user id=sa;password=123456;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

如果有什么我可以帮忙的,请随时告诉我。

【讨论】:

我通过创建一个新的 WCF 服务项目并仅复制其 Web 配置解决了一般问题,这导致我出现 sql 连接错误。我正在使用集成并切换到用户 /pass 并解决了。谢谢。

以上是关于WCF 服务在本地而非服务器 IIS 上工作以获取功能的主要内容,如果未能解决你的问题,请参考以下文章

Fileless Restful WCF 在本地 IIS7 中托管时无法正常工作,但可以在本地运行

如何在 Sql Server 上设置安全性以允许 WCF 服务访问?

使用 IIS 将 WCF 服务从一台服务器路由到另一台服务器

访问本地 IIS 上托管的 WCF 服务时出错:“相对 URI 不支持此操作。”

新的 IIS 服务器; WCF 服务;方法出现,类没有

wcf 上没有积极收听的频道