使用MVC / WebApi和WCF的解决方案 - 身份验证

时间:2017-02-14 18:01:47

标签: c# asp.net asp.net-mvc wcf asp.net-web-api

我被分配了一个当前使用WCF服务的旧项目。

重点是更新(更像是重新开始)项目以使用ASP.NET MVC5和Web API。问题是第三方使用WCF服务,他们可能不愿意改变他们的通信结束。

项目的主要功能是两个基本功能,一个是接收数据,保存它,只显示几个主题和历史图表的最后状态,另一个是发送数据(打开/关闭主题)。

我的想法是按原样维护WCF服务(接收/发送/保存数据),只需将其添加到包含MVC和Web API(读取数据)的新解决方案中。 他们需要(我认为)在同一个项目中,因为最终目标是在可能的情况下在WCF服务上实现SignalR。

主要问题是MVC和WebAPI将落后于身份验证,但WCF不会。当我尝试在同一个项目上测试WCF时,它失败了,因为它要求“登录”。

  

错误:无法从中获取元数据   http://localhost:50598/ServiceTest.svc如果这是Windows(R)   请访问您的Communication Foundation服务   检查您是否已在指定的位置启用元数据发布   地址。有关启用元数据发布的帮助,请参阅   MSDN文档在   http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata交流   错误URI:http://localhost:50598/ServiceTest.svc元数据包含一个   无法解决的参考:   'http://localhost:50598/ServiceTest.svc'。内容类型text / html;   响应消息的charset = utf-8与内容类型不匹配   绑定(application / soap + xml; charset = utf-8)。如果使用   自定义编码器,请确保IsContentTypeSupported方法是   实施得当。响应的前1024个字节是:'?

     

登录。

     

Usernamehttp:// localhost:50598 / ServiceTest.svc HTML文档没有   包含Web服务发现信息。

我尝试了我能在网上找到的所有内容。但找不到任何可行的东西。

我的上一次包括摆弄web.config:

<system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="UnsecuredBinding">
          <security mode="None">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="serviceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="Management.ServiceAspNetAjaxBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
      <service name="Management.ServiceTest" behaviorConfiguration="serviceBehavior">
        <endpoint address="" behaviorConfiguration="Management.ServiceAspNetAjaxBehavior" binding="webHttpBinding" contract="ServiceLibrary.IService" bindingConfiguration="UnsecuredBinding"/>
      </service>
    </services>
  </system.serviceModel>

我还添加了routes.IgnoreRoute到RouteConfig.cs

routes.IgnoreRoute("{resource}.svc/{*pathInfo}");
routes.IgnoreRoute("{resource}.svc");

并尝试将此添加到Global.asax

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
   HttpApplication context = (HttpApplication)sender;

   if (context.Request.Url.ToString().Contains(".svc"))
   {
      context.Response.SuppressFormsAuthenticationRedirect = true;
   }
}

我的问题:

  1. 如果我将WCF方法迁移到WebAPI,客户端是否需要对其进行任何修改?

  2. 如果是,我如何在不受登录障碍影响的情况下将WCF集成到我的MVC / WebAPI项目中。

1 个答案:

答案 0 :(得分:0)

回答问题1,是的,您的客户必须进行修改。 WCF是SOAP / XML,其中WebApi是REST / JSON(通常)用于初学者。 对于2,如果WCF服务正常工作,请保持原样。您不需要直接将其包含在项目中,只需使用&#34;添加服务参考&#34; Visual Studio中的向导使客户端与其进行交互。 作为旁注,您在实验中出现的错误可能是由于在Visual Studio中使用内置的IIS express实例,它不支持同时运行匿名和经过身份验证的应用程序,因此您的WCF服务最终启用了身份验证