【问题标题】:Debug a custom service host factory in WCF在 WCF 中调试自定义服务主机工厂
【发布时间】:2016-11-10 00:27:38
【问题描述】:

我使用 VisualStudio 2015 创建了一个新的 WCFServiceLibrary。我执行了它,一切都很好,我可以看到带有示例方法的 WCF 测试客户端,并且可以从浏览器访问。

现在我想添加一个自定义服务主机工厂。我添加了这个类:

namespace WcfServiceLibrary1
{
    public class DerivedFactory : ServiceHostFactory
    {
        protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            ServiceHost host = new ServiceHost(serviceType, baseAddresses);

            // do something here

            return host;
        }
    }
}

然后我在 app.config 中添加了 serviceHostingEnvironment 部分:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <system.serviceModel>

<serviceHostingEnvironment>
  <serviceActivations>
    <add service="WcfServiceLibrary1.Service1"
          relativeAddress="./MyService.svc"
          factory="WcfServiceLibrary1.DerivedFactory"/>
  </serviceActivations>
</serviceHostingEnvironment>

    <services>
      <service name="WcfServiceLibrary1.Service1">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/" />
          </baseAddresses>
        </host>
        <endpoint address="" binding="basicHttpBinding" contract="WcfServiceLibrary1.IService1">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

我在 DerivedFactory 类的 CreateServiceHost 方法中放置了一个断点。我执行了这个项目,但是:

我已经用 relativeAddress="/MyService.svc" 和 relativeAddress="MyService.svc" 进行了测试,但这不起作用。

有没有办法在调试模式下测试自定义工厂?

服务类:

namespace WcfServiceLibrary1
{
    public class Service1 : IService1
    {
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }
    }
}

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    这个具体的答案很简单,并且涉及冗余配置。为了让我们了解更多,我已经详细阐述了我的答案。

    通过 IIS 托管服务访问您的服务的正确方法是以下 URL http://localhost:8733/MyService.svc
    这是由

    规定的
    <add service="WcfServiceLibrary1.Service1"
        relativeAddress="./MyService.svc"
        factory="WcfServiceLibrary1.DerivedFactory"/>
    

    仅在自托管服务中您将需要 baseAddress 配置,因此它是多余的,可以删除。

    <host>
      <baseAddresses>
        <add baseAddress = "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/" />
      </baseAddresses>
    </host>
    

    如果您想访问完整地址 http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/,您需要将 relativeAddress 更改为以下内容:

    relativeAddress="./Design_Time_Addresses/WcfServiceLibrary1/Service1/MyService.svc"
    

    【讨论】:

    • 感谢您的回答。也许我的问题太简单了,我只是想在调试模式下测试我的自定义服务主机,使用 WCF 服务主机 (WcfSvcHost.exe)。
    • 当我重写我的问题时,我发现了另一个问题:(stackoverflow.com/questions/1543327/…) 我认为不可能强制 WcfSvcHost.exe 使用我的自定义服务主机。那么,为了调试我的解决方案,我必须使用自托管吗?
    • 如果没有正确配置您的服务,您将无法使用 WCF 服务主机。因此,我敦促您再次阅读答案并调整配置。
    • 我了解到我的相对地址配置不正确。我像你告诉我的那样改变了它,但即使这样,WCF 服务主机也看不到我的自定义服务主机工厂。
    • @RobertoCarlos,验证您的服务具体类的名称是 Service1
    猜你喜欢
    • 2013-02-06
    • 1970-01-01
    • 2013-11-15
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多