关于通过ServiceHostFactory扩展wcf的问题???

qingYun1029 2015-10-20 06:23:59
在学习wcf,由于项目中通过实现ServiceHostFactory发布的wcf接口——项目中使用UnityServiceHostFactory,我想跳过这个组件,于是用了ServiceHostFactory,

创建一个wcf项目,然后删除相关的.svc文件,自定义类WcfServiceFactory:如下


public class WcfServiceFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
ServiceHost host = new ServiceHost(serviceType, baseAddresses);
foreach (Uri address in baseAddresses)
{

//WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);

BasicHttpBinding b = new BasicHttpBinding();

b.Name = serviceType.Name;
host.AddServiceEndpoint(serviceType.GetInterfaces()[0], b, address);
}
return host;
}


定义ICompany接口:

[ServiceContract]
public interface ICompany
{
[OperationContract]
IEnumerable<Company> GetAllCompanies();
}


接口实现类:


public class CompanyService : ICompany
{
public IEnumerable<Company> GetAllCompanies()
{
return new List<Company>()
{
new Company{ CompanyId = 1, CompanyName ="company 1", Email="company1@126.com"},
new Company{CompanyId = 2, CompanyName = "company 2", Email="company2@126.com"}
};
}
}


模型类:

[DataContract]
public class Company
{
[DataMember]
public int CompanyId { get; set; }

[DataMember]
public string CompanyName { get;set;}

[DataMember]
public string Email { get;set;}
}


配置文件:


<system.serviceModel>
<!--省略部分-->
<services>
<!--<service name="WcfService.User">
<endpoint address="" binding="basicHttpBinding" contract="WcfService.IUser" />
</service>-->
<service name="WcfService.CompanyService">
<endpoint address="http://localhost:5166/Company" binding="basicHttpBinding" contract="WcfService.ICompany" />
</service>
</services>

<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
<serviceActivations>
<add factory="WcfService.Services.WcfServiceFactory" service="WcfService.CompanyService" relativeAddress="Company.svc" />
</serviceActivations>
</serviceHostingEnvironment>
</system.serviceModel>


错误信息:
如果在配置中将“system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled”设置为 true,则需要终结点指定相对地址。如果在终结点上指定相对侦听 URI,则该地址可以是绝对地址。若要解决此问题,请为终结点“http://localhost:5166/Company”指定相对 URI。
...全文
167 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
moonwrite 2015-10-21
  • 打赏
  • 举报
回复
原理:http://developer.51cto.com/art/201205/334457.htm
moonwrite 2015-10-21
  • 打赏
  • 举报
回复
http://blog.csdn.net/songyefei/article/details/7397296 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 在我记忆中好像就是这么一回事 2年多没有搞wcf了~ 如果还不行 百度:wcf IMetadataExchange 看看 应该还有一个baseaddress的问题
qingYun1029 2015-10-21
  • 打赏
  • 举报
回复
引用 2 楼 moonwrite 的回复:
http://blog.csdn.net/penginpha/article/details/7378206
这一段配置是自动生成的,和你贴出来的一样,如下:

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>
moonwrite 2015-10-21
  • 打赏
  • 举报
回复
http://blog.csdn.net/penginpha/article/details/7378206
qingYun1029 2015-10-21
  • 打赏
  • 举报
回复
引用 4 楼 moonwrite 的回复:
http://blog.csdn.net/songyefei/article/details/7397296 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 在我记忆中好像就是这么一回事 2年多没有搞wcf了~ 如果还不行 百度:wcf IMetadataExchange 看看 应该还有一个baseaddress的问题
没找到结果,还是先学习吧,以后补上这个demo
qingYun1029 2015-10-20
  • 打赏
  • 举报
回复
尝试了好久,也找了很久答案,还是没有搞定

求指点:

62,054

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧