asp.net - 如何在 IIS 中托管没有 SVC 文件的 WCF 服务

标签 asp.net web-services wcf rest soap

我想在 IIS 中部署一个双接口(interface)(SOAP/REST/XML/JSON)WCF 服务,只有一个配置文件和二进制文件,而 URL 中没有 svc 文件

我们使用 VS2012 和 .Net 4.5

我们有类似的工作,我在这里遵循了指南:
http://blogs.msdn.com/b/rjacobs/archive/2010/04/05/using-system-web-routing-with-data-services-odata.aspx

我添加了一个 Global 类

public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        RegisterRoutes();
    }

    private void RegisterRoutes()
    {
        DataServiceHostFactory factory = new DataServiceHostFactory();
        RouteTable.Routes.Add(new ServiceRoute("wrap", factory, typeof(NeOtheWrapper)));
    }
}

我使用了现有的 web.config 来定义所有端点:
<system.serviceModel>
    <!-- Clients -->
    <client>
      <endpoint name="MySoftLive" address="https://backof.somewebsitett.com/Cmp.MySoft.bl/MySoft.svc" binding="basicHttpsBinding" bindingConfiguration="soapSecureBindingConfig" contract="Cmp.MySoft.BL.WCF.MySoftInterface" />
      <endpoint name="MySoftTest" address="http://localhost:49957/MySoft.svc"                         binding="basicHttpBinding"  bindingConfiguration="soapBindingConfig"       contract="Cmp.MySoft.BL.WCF.MySoftInterface" />
    </client>
    <!-- Services -->
    <services>
      <service name="Cmp.MySoft.BL.NeOthe.NeOtheWrapper">
        <endpoint name="rest"       address="rest" behaviorConfiguration="restEndpointBehaviour" binding="webHttpBinding"    bindingConfiguration="restBindingConfig"       contract="Cmp.MySoft.BL.NeOthe.INeOtheWrapper"/>
        <endpoint name="restSecure" address="rest" behaviorConfiguration="restEndpointBehaviour" binding="webHttpBinding"    bindingConfiguration="restSecureBindingConfig" contract="Cmp.MySoft.BL.NeOthe.INeOtheWrapper"/>
        <endpoint name="mex"        address="mex"  behaviorConfiguration=""                      binding="mexHttpBinding"    bindingConfiguration="mexBindingConfig"        contract="Cmp.MySoft.BL.NeOthe.INeOtheWrapper"/>
        <endpoint name="mexSecure"  address="mex"  behaviorConfiguration=""                      binding="mexHttpsBinding"   bindingConfiguration="mexSecureBindingConfig"  contract="Cmp.MySoft.BL.NeOthe.INeOtheWrapper"/>
        <endpoint name="soap"       address="soap" behaviorConfiguration=""                      binding="basicHttpBinding"  bindingConfiguration="soapBindingConfig"       contract="Cmp.MySoft.BL.NeOthe.INeOtheWrapper"/>
        <endpoint name="soapSecure" address="soap" behaviorConfiguration=""                      binding="basicHttpsBinding" bindingConfiguration="soapSecureBindingConfig" contract="Cmp.MySoft.BL.NeOthe.INeOtheWrapper"/>
      </service>
    </services>
    <!--  Binding Configurations -->
    <bindings>
      <webHttpBinding>
        <binding name="restBindingConfig">
          <security mode="None"/>
        </binding>
        <binding name="restSecureBindingConfig">
          <security mode="Transport"/>
        </binding>
      </webHttpBinding>
      <mexHttpBinding>
        <binding name="mexBindingConfig"/>
      </mexHttpBinding>
      <mexHttpsBinding>
        <binding name="mexSecureBindingConfig"/>
      </mexHttpsBinding>
      <basicHttpsBinding>
        <binding name="soapSecureBindingConfig">
          <security mode="Transport"/>
        </binding>
      </basicHttpsBinding>
      <basicHttpBinding>
        <binding name="soapBindingConfig">
          <security mode="None"/>
        </binding>
      </basicHttpBinding>
    </bindings>
    <!-- Behaviour Configurations -->
    <behaviors>
      <endpointBehaviors>
        <behavior name="restEndpointBehaviour">
          <webHttp helpEnabled="true" defaultBodyStyle="Bare" defaultOutgoingResponseFormat="Json" automaticFormatSelectionEnabled="true" faultExceptionEnabled="true" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <!-- Hosting Environment Settings -->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  </system.serviceModel>

它编译、运行,如果我浏览到 http://mypc:12345/wrap/rest/help我得到了自动生成的 ASP.NET REST 帮助页面。

但是,如果我去 http://mypc:12345/wrap/soap/我收到 400 错误请求。

我不能用 ?wsdl 作为后缀来获取 wsdl,或者将 url 传递给 svcutil(不需要soap+xml)

我希望 .SVC SOAP 占位符页面会出现,就像/help 对 REST 所做的一样。

如果我浏览到有效的 .svc 文件(它与/wrap 处于同一级别)并且soap 服务有效,元数据发布也是如此。

我使用了错误的 URL 还是我的配置错误?

最佳答案

如果您使用的是 WCF 4.0 或更高版本,则可以使用“无文件”激活。添加类似以下内容来配置您的文件:

<serviceHostingEnvironment multipleSiteBindingsEnabled="true">
  <serviceActivations>
    <add factory="System.ServiceModel.Activation.ServiceHostFactory" 
         relativeAddress="Soap.svc" 
         service="Cmp.MySoft.BL.NeOthe.NeOtheWrapper" />
  </serviceActivations>
</serviceHostingEnvironment>

这允许您在没有物理 .svc 文件的情况下托管 WCF 服务。 relativeAddress是相对于站点的基地址的,您需要像往常一样创建 IIS 应用程序。

请参阅 A Developer's Introduction to Windows Communication Foundation 4 中的“无文件激活”部分了解更多信息。

关于asp.net - 如何在 IIS 中托管没有 SVC 文件的 WCF 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24530411/

相关文章:

asp.net - 有关 Azure 文本分析中情绪分析频率的最佳实践

c# - 重定向到其他页面后如何显示响应消息?

ios - 如何处理 Json 中的 <null> 在 objective-c 中崩溃?

wcf - 如何使用用户名/密码 + SSL 使用 WCF 配置安全 RESTful 服务

c# - WCF 服务调用失败...我的配置文件有什么问题?

c# - 使用正则表达式将目标 ="_blank"列入白名单

javascript - 在 JavaScript 中设置服务器端变量的不同方法的优点

android - 使用 JDBC 驱动程序直接从 android 连接到数据库与使用 Webservice 之间有什么区别

mysql - 尝试获取带有在线数据库的 Web 应用程序?真的很挣扎

c# - 在 task.Factory.FromAsync 中包装 WCF 异步调用不返回任何结果