无法在 IIS 中正确托管 WCF 服务。错误 404
Posted
技术标签:
【中文标题】无法在 IIS 中正确托管 WCF 服务。错误 404【英文标题】:Can't properly host a WCF Service in IIS. Error 404 【发布时间】:2015-12-24 09:14:17 【问题描述】:我需要一个通过 REST 提供 PDF 的 WCF 服务库。
例如我有一个这样的网址:localhost:8732/service1/reports/ok
我收到一份 PDF 作为回复。它是本地文件系统中的固定文件。
这是我当前的代码:
Service.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace WcfJsonRestService
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in both code and config file together.
[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
public class Service1 : IService1
public Stream GetReport(string value)
WebOperationContext.Current.OutgoingResponse.ContentType = "application/pdf";
FileStream f = new FileStream("C:\\invoice.pdf", FileMode.Open);
int length = (int)f.Length;
WebOperationContext.Current.OutgoingResponse.ContentLength = length;
byte[] buffer = new byte[length];
int sum = 0;
int count;
while ((count = f.Read(buffer, sum, length - sum)) > 0)
sum += count;
f.Close();
return new MemoryStream(buffer);
IService.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
namespace WcfJsonRestService
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
[ServiceContract]
public interface IService1
// TODO: Add your service operations here
[OperationContract(Action = "*")]
[WebInvoke(Method = "GET", //Este metodo si esta en POST, te dice que metodo no permitido
UriTemplate = "reports/value")]
Stream GetReport(string value);
// Use a data contract as illustrated in the sample below to add composite types to service operations.
// You can add XSD files into the project. After building the project, you can directly use the data types defined there, with the namespace "WcfJsonRestService.ContractType".
[DataContract]
public class CompositeType
bool boolValue = true;
string stringValue = "Hello ";
[DataMember]
public bool BoolValue
get return boolValue;
set boolValue = value;
[DataMember]
public string StringValue
get return stringValue;
set stringValue = value;
App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="WcfJsonRestService.Service1">
<endpoint address="http://localhost:8732/service1"
binding="webHttpBinding"
contract="WcfJsonRestService.IService1"/>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior>
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
<startup>
<supportedRuntime version="v4.1" sku=".NETFramework,Version=v4.1"/>
</startup>
</configuration>
请不要注意那个误导性的名称“WcfJsonRestService”,该名称稍后将更改为更合适的名称...
当我在 Visual Studio 2013 中运行它时,一切都很好(除了来自 Microsoft WCF 服务主机的警告,它没有找到任何服务元数据)。当我访问http://localhost:8732/service1/somerandomstring 时,浏览器会打开pdf。 (请注意,它目前是我文件系统上的一个固定目录...)
问题是当我尝试发布或主机时。我遵循了几个关于在 IIS 中托管的教程,但没有成功。 我应该怎么做才能使它工作?
操作系统:Windows 8.1 .NET 框架 4
【问题讨论】:
当您在 IIS 上发布时,您到底遇到了什么错误/问题? 我收到 404 错误 请求的 URL 地址:localhost:8732/service1/reports/ok Ruta de acceso física:C:\inetpub\wwwroot\PDFprueba\service1\reports\ok 好的..我会尝试在我的设备上做..然后更新你 你能看到inetmgr
发布的网站吗?
【参考方案1】:
几天前我偶然发现了这个问题:这是由于缺少处理此类调用所需的处理程序映射。有几种方法可以解决此问题,例如手动执行ServiceModelReg.exe
控制台命令。我在下面提出的解决方法更复杂,但它的优点是可以在不更改 Web 服务器的默认行为的情况下解决特定问题,从而避免潜在的副作用。
安装完成后,您应该能够运行 WCF 服务,而不会再次出现 404 错误。
有关此特定问题及其解决方法的更多信息,您也可以在我的博客上read this post。
【讨论】:
【参考方案2】:我试图在我的机器上填充问题,我明白了。我也找到了解决方案。在 IIS 中托管后。您访问该服务的网址将是http://localhost/<name of the site while hosting to iis>/<namespaceofyourservice>.<servicename>/<method name>
。
所以就我而言,它变成了http://localhost/WcfJSONPDF/WcfJsonRestService.Service1.svc/reports/ok
。这里的“ok”是传递给 web 方法的字符串。
我知道我们必须在 url 中传递命名空间,但你现在必须接受它,这很奇怪。我会寻找一些解决方法。这是 url 定义的图像:。
以下是将您的Wcf Service Library
项目发布到 IIS7 的步骤。请看下图:
Click on Build-->Publish Webservice-->Name the url(website name)-->Click on publish button-->Click publish on Local IIS
. 仅此而已。我希望你能得到想要的输出。 如果你还有一些问题,那么用下面的更新App.config
:
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<services>
<service name="WcfJsonRestService.Service1" behaviorConfiguration="Metadata">
<endpoint address=""
binding="webHttpBinding"
contract="WcfJsonRestService.IService1" behaviorConfiguration="Restbeh"/>
<endpoint name="mex"
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:80/service1" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="Restbeh">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="Metadata">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<startup>
<supportedRuntime version="v4.1" sku=".NETFramework,Version=v4.1"/>
</startup>
</configuration>
【讨论】:
哇。我会在星期一检查它,我希望可以将此答案标记为正确。谢谢。 @Mr_LinDowsMac 好的,欢迎您:)。 嗨,是的,我有一些问题。也许我做错了什么:/ 哦..好的..所以你有解决方案吗?现在工作正常吗? 目前这只适用于从 Visual Studio 运行,这次没有抱怨元数据......但是,我仍然没有让它在我的 IIS 中工作【参考方案3】:可能是权限问题,在 IIS 中托管时,您需要授予站点在该文件夹及其内容下运行的身份的读取权限。您在哪个身份下运行取决于您使用的 IIS 版本以及您如何配置应用程序池。您可以通过查看应用程序池的高级设置并向下滚动到身份来检查它是哪个身份。然后检查您的 pdf 文件夹中该用户的安全设置。
【讨论】:
以上是关于无法在 IIS 中正确托管 WCF 服务。错误 404的主要内容,如果未能解决你的问题,请参考以下文章
Fileless Restful WCF 在本地 IIS7 中托管时无法正常工作,但可以在本地运行
IIS 7.5 中的 WCF 服务托管 - 由于扩展配置,无法提供您请求的页面 [重复]
我们啥时候应该在 IIS 中托管 WCF 服务,啥时候应该在 Windows 服务中托管?