服务仅在调试时有效

时间:2016-09-22 11:12:44

标签: c# asp.net wcf powershell iis

我已经创建了WCF服务,并且在部署之后无法对其进行测试。这是我用来测试它的PowerShell:

$service = New-WebServiceProxy -Uri http://localhost:16651/Service.svc
$service.GetList()

使用Visual StudioF5调试服务时,我可以毫无问题地调用此脚本。 GetList()会返回一长串电话号码。

但是,当我在IIS上托管该站点并运行上述脚本时,我得到一个返回值。

服务工厂

因此,在this question之后,我将此属性添加到Service.svc

Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"

然而,这导致我的脚本在第一行返回错误:

  

New-WebServiceProxy:未将对象引用设置为对象的实例。

这对我没有任何意义,因为我没有引用任何空对象...(在调试和通过IIS托管时出现此错误)。

的Web.Config

接下来,我尝试根据链接的问题更新我的web.config

<services>
  <service name="LyncWebService.Service">
    <endpoint binding="webHttpBinding" contract="LyncWebService.IService" behaviorConfiguration="web"/>
  </service>
</services>

<behaviors>   
    <serviceBehaviors>
    </serviceBehaviors>
    <endpointBehaviors>
      <behavior name="web">
        <webHttp/>
      </behavior>
    </endpointBehaviors>
</behaviors>

但是,现在当我尝试运行我的PowerShell脚本时,我在调试期间和在IIS上托管时都会出现此错误(同样在第一行):

  

HTML文档不包含Web服务发现信息。

我完全迷失在这里,不知道出了什么问题。我怀疑这是与我的配置文件有关,因为它在我调试配置之前从VS调试时似乎工作。

非常感谢任何帮助或指导 - 如果我能提供任何其他信息或测试任何内容,请告诉我。

以下是目前构成我的服务的代码:

Service.svc.cs

namespace LyncWebService
{
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        [WebInvoke]
        List<string> GetList();
    }
    public class Service : IService
    {
        public List<string> GetList()
        {
            return Ps.GetAssignedNumbers(@"
                Set-ExecutionPolicy RemoteSigned
                Import-Module Lync
                $(Get-CSUser).LineUri"
            );
        }
    }
}

的Web.Config

<?xml version="1.0"?>
<configuration>
  <appSettings/>
  <system.web>
    <compilation debug="true" targetFramework="4.0"/>
    <httpRuntime/>
  </system.web>
  <system.serviceModel>

    <services>
        <service name="LyncWebService.Service">
        <endpoint binding="webHttpBinding" contract="LyncWebService.IService" behaviorConfiguration="web"/>
        </service>
    </services>

    <behaviors>   
        <serviceBehaviors>
        </serviceBehaviors>

        <endpointBehaviors>
          <behavior name="web">
            <webHttp/>
          </behavior>
        </endpointBehaviors>
    </behaviors>

    <protocolMapping>
      <!--<add binding="basicHttpsBinding" scheme="https"/>-->
      <add binding="webHttpsBinding" scheme="https"/>
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="false" multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

1 个答案:

答案 0 :(得分:2)

感谢Jonathan Coffey,我意识到该服务是由LocalSystem帐户运行的。

将此更改为我自己的用户帐户并在web.config上托管原始IIS后,我现在可以使用PowerShell脚本检索完整列表。

  1. 打开IIS
  2. 应用程序池
  3. 右键单击“应用程序池”
  4. 高级设置...
  5. 过程模型 - &gt;身份
  6. 自定义帐户(不要忘记为用户名包含域名!)