无法解析vanilla IIS托管的WCF示例中的错误:无法找到作为服务属性值[...]提供的类型[...]

时间:2015-01-20 19:49:09

标签: c# wcf iis

此错误的文本经常在Stack Overflow上报告,但没有一个解决方案适用于我们的情况。 有问题的代码不能简单。它来自Microsoft {IIS}托管的WCF服务示例(一个简单的计算器服务),位于[http://msdn.microsoft.com/en-us/library/ms733766%28v=vs.110%29.aspx] 1

错误的要点是经常报告的"无法找到作为服务属性值[...]提供的类型[...]。"我附上了完整错误文本的屏幕快照。这里还有我的服务和配置文件,接口和代码的代码示例。

为了它的价值,我得到了相同的#34;提供的类型无法找到"我尝试使用Microsoft描述的方法在IIS中托管的任何WCF服务的错误。这些都很简单"你好世界"程式。我们已经尝试将代码移动到建筑物中的其他机器并在那里托管,但我们得到了同样的错误。我们已经尝试过使用Windows 2003 Server和Windows 8.我们正在使用.Net 4.5 Framework在VS 2013中进行开发。

任何和所有帮助表示赞赏......

Service.svc:

<%@ServiceHost language=c# Debug="true" Service="Microsoft.ServiceModel.Samples.CalculatorService"%>

ICalculatorService.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System;
using System.ServiceModel;

namespace Microsoft.ServiceModel.Samples
{
    [ServiceContract]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double n1, double n2);
        [OperationContract]
        double Subtract(double n1, double n2);
        [OperationContract]
        double Multiply(double n1, double n2);
        [OperationContract]
        double Divide(double n1, double n2);
    }
}

CalculatorService.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System;
using System.ServiceModel;

namespace Microsoft.ServiceModel.Samples
{
    public class CalculatorService : ICalculator
    {
        public double Add(double n1, double n2)
        {
            return n1 + n2;
        }
        public double Subtract(double n1, double n2)
        {
            return n1 - n2;
        }
        public double Multiply(double n1, double n2)
        {
            return n1 * n2;
        }
        public double Divide(double n1, double n2)
        {
            return n1 / n2;
        }
    }
}

的web.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <!-- This section is optional with the default configuration model introduced in .NET Framework 4 -->
      <service name="Microsoft.ServiceModel.Samples.CalculatorService">

        <!-- This endpoint is exposed at the base address provided by host:  http://localhost/servicemodelsamples/service.svc  -->
        <endpoint address=""
                  binding="wsHttpBinding"
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />

        <!-- The mex endpoint is exposed at http://localhost/servicemodelsamples/service.svc/mex -->
        <endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />
      </service>
    </services>
  </system.serviceModel>

</configuration>

错误: enter image description here

最后,我通过inetmgr添加了一个指向我的应用程序位置的IIS应用程序: enter image description here

在此处找到:

enter image description here

2 个答案:

答案 0 :(得分:0)

尝试使用CalculatorService - 属性来装饰[ServiceBehavior]类。

namespace Microsoft.ServiceModel.Samples
{
    [ServiceBehavior]
    public class CalculatorService : ICalculator
    {
        //...

答案 1 :(得分:0)

哎呀!所以显然有一个相对于服务文件的默认位置,当放置程序集时,所有工作都应该如此。 将程序集放在包含.svc文件的文件夹的\ bin子文件夹中,可以生成有效的服务。

正如您所料,编译器在[projectfolder] \ bin \ debug或[projectfolder] \ bin \ release中生成CalculatorService.dll。使用[projectfolder]中的.svc文件,您会收到错误。

只需将dll上移一级到\ bin文件夹即可解决问题。这似乎有点违反直觉......我想如果这是一个默认的文件夹问题,那么将.svc文件放在与.dll相同的位置更有意义。微软的例子确实没有给出任何线索。无论如何,为了将来参考,以下是从微软网站上获取的代码示例:

.svc文件的位置: enter image description here

装配的位置: enter image description here

IIS配置为指向.svc文件的位置,如原始问题描述中所述: enter image description here

根据Microsoft文章浏览到URL,我们现在看到了我们希望的内容: enter image description here