WCF部署到IIS 6导致403权限错误。

4
我从未将WCF服务部署到IIS 6上。我有一个服务正在使用WCF项目的默认配置部署到IIS 6上。我之后简化了配置,以为那可能是问题所在。如果我在浏览器中浏览该服务,则会出现以下错误:

HTTP Error 403.1 - Forbidden: Execute access is denied.

我的配置现在看起来像这样:

<system.serviceModel>
    <services>
        <service name="MyCompany.WebServices.MyService">
            <endpoint address="" binding="basicHttpBinding" contract="MyCompany.WebServices.IMyService" />
        </service>
    </services>
</system.serviceModel>

如果我尝试将它作为一个引用添加到ASP.NET MVC中,我会得到以下错误信息:
“下载 'http://ws.mycompany.com/MyService.svc' 时发生错误。请求失败,HTTP状态为403:禁止访问。元数据包含无法解析的引用:'http://ws.mycompany.com/MyService.svc'。HTTP请求被禁止,客户端身份验证方案为“匿名”。远程服务器返回错误:(403)禁止访问。如果服务在当前解决方案中定义,请尝试构建解决方案并重新添加服务引用。”
有什么想法是怎么回事吗?
更新:
似乎是我的IIS 6配置问题。我这样假设,因为我创建了一个全新的ASP.NET 3.5 WCF应用程序,并将其部署到http://ws.unitedoneresources.com/Service1.svc的新URL上。如果我尝试调用该服务,则会出现与上述相同的HTTP错误。整个服务配置如下:
  <system.serviceModel>
    <services>
      <service name="WcfService1.Service1" behaviorConfiguration="WcfService1.Service1Behavior">
        <!-- Service Endpoints -->
        <endpoint address="" binding="wsHttpBinding" contract="WcfService1.IService1">
          <!-- 
              Upon deployment, the following identity element should be removed or replaced to reflect the 
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
              automatically.
          -->
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WcfService1.Service1Behavior">
          <!-- 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="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

再次强调,这是一个全新的ASP.NET 3.5 WCF应用程序,因此我没有修改任何项目本身的内容。


服务是否托管在您正在查询的同一台计算机上? - Jeff
不是的。一个是数据库服务器,另一个是IIS服务器。数据库调用都在使用EF的类库内部处理。 - Jason Gaylord
我已更新上述问题。我尝试设置IIS Web以具有执行权限,重新启动了IIS,但没有起作用。我也在一个IIS7盒子上尝试过,但无济于事。这一定是我做错了什么。 - Jason Gaylord
4个回答

2
我攻击了该网站,使用命令提示符在IIS 6上安装了WCF(使用ServiceModelReg.exe /i /x),然后重新部署。它起作用了!感谢!

1

在寻找解决方案时发现了这个问题。我忘记在服务目录上更改权限为“脚本和可执行文件”。我使用的是II7。


0

在这里,您没有给我们提供太多信息 - 缺少的是服务器端配置部分,它可以向我们展示您如何设置安全性 - 您能否更新您的问题并向我们展示服务器端配置和客户端调用服务器时 <system.serviceModel> 标记中的所有内容

从系统默认值猜测,使用basicHttpBinding将导致默认安全设置为无 - 并且似乎您的服务器端配置需要某种形式的安全性。几乎似乎您的安全设置不同步,因此导致了此错误。

另一个要点是:您如何设置IIS端?您是否为服务创建了虚拟目录?基本上,在IIS中托管时,您的服务URL由服务器名称(加上可能的端口),*.svc文件所在的虚拟目录以及svc文件本身的名称和扩展名确定。


在服务器端,我现在列出的就是我所拥有的。在客户端,同样是一个普通的ASP.NET MVC应用程序。在IIS中,该服务设置在一个全新的网站中,没有其他内容。 - Jason Gaylord
@Jason:好的,但你能给我们展示一下客户端的配置吗?肯定有一些配置! - marc_s
@Jason:这就是让我困惑的地方——你一直说你“只是浏览”网站——这是否意味着你正在使用(或想要使用)REST?因为如果是这样,那么你的服务器端绑定就错了——你必须使用webHttpBinding而不是basicHttpBinding - marc_s
好的,我正在尝试以下两件事情:1)打开浏览器(IE或Firefox),并浏览到URL“http://ws.mycompany.com/MyService.svc”或2)打开VS 2008。通过上面的URL添加服务引用。我真的很希望只使用选项2就可以了,但是我正在尝试使用选项1进行测试。我想绑定不允许选项1,所以我更关心如何允许VS“添加引用”。 - Jason Gaylord
@Jason:是的,#1 不起作用 - 在默认 WCF 服务中你看不到任何东西。你知道 WCF 测试客户端吗?它深藏在 Visual Studio BIN 目录中 - 并且非常有用,可以检查你的 WCF 服务是否对外部世界“可见”(就是 VS “添加服务引用”所需的元数据)。请搜索 WCF 测试客户端并查找文件所在位置 - 尝试一下,它是值得的! - marc_s
显示剩余3条评论

0

我们遇到了类似的症状,但仅在 IIS 6.0 下使用 PUT 和 DELETE 动词时出现。

在我们的 IIS 应用程序中,默认情况下,.svc 扩展名只允许 GET、POST 动词。

为应用程序添加这些动词(或允许所有动词)的 .svc 扩展名,可以解决该问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接