在 mvc 中使用 WCF 服务时出现问题
Issue when using WCF service in mvc
我有一个带有 CSLA 的 WCF 项目,我已经在我的 IIS 服务器中发布了这个服务和 MVC 应用程序,但是当从 Web 应用程序调用该服务时它抛出了一个错误
System.ServiceModel.Security.SecurityNegotiationException: The caller was not authenticated by the service. ---> System.ServiceModel.FaultException: The request for security token could not be satisfied because authentication failed.
这是我的服务web.config
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<services>
<service name="Csla.Server.Hosts.WcfPortal" behaviorConfiguration="returnFaults">
<endpoint binding="wsHttpBinding" bindingConfiguration="wsHttpBinding_IWcfPortal" contract="Csla.Server.Hosts.IWcfPortal" />
</service>
<service name="Csla.Server.Hosts.Mobile.WcfPortal" behaviorConfiguration="returnFaults">
<endpoint binding="basicHttpBinding" bindingConfiguration="basicHttpBinding_IWcfPortal" contract="Csla.Server.Hosts.Mobile.IWcfPortal" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="basicHttpBinding_IWcfPortal" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" maxBufferSize="2147483647">
<readerQuotas maxBytesPerRead="2147483647" maxArrayLength="2147483647" maxStringContentLength="2147483647" maxNameTableCharCount="2147483647" maxDepth="2147483647" />
</binding>
</basicHttpBinding>
<wsHttpBinding>
<binding name="wsHttpBinding_IWcfPortal" maxReceivedMessageSize="2147483647">
<readerQuotas maxBytesPerRead="2147483647" maxArrayLength="2147483647" maxStringContentLength="2147483647" maxNameTableCharCount="2147483647" maxDepth="2147483647" />
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="returnFaults">
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
我在我的 MVC web.config 中使用了这个服务,就像这样。
<add key="CslaAuthentication" value="Csla" />
<add key="CslaDataPortalProxy" value="Csla.DataPortalClient.WcfProxy, Csla" />
<add key="CslaDataPortalUrl" value="http://www.someurl.net/WcfFullPortal.svc" />
然后在我直接从我的服务项目调用服务后,一切正常。
<add key="CslaDataPortalUrl" value="http://localhost:11170/WcfFullPortal.svc" />
并且还尝试了已发布的 IP 地址,同样工作正常
<add key="CslaDataPortalUrl" value="http://10.4.56.75/WcfFullPortal.svc" />
只有当我使用已发布的主机名 (http://www.someurl.net/WcfFullPortal.svc) 时才会出现问题。我已经通过正在运行的浏览器打开了这个URL。
在 web.config <system.serviceModel>
部分的部分之后添加以下绑定配置。
<bindings>
<wsHttpBinding>
<binding name="TheBindingConfig">
<security mode="None" />
</binding>
</wsHttpBinding>
</bindings>
只需将 Csla.DataPortalClient.WcfProxy
更改为 Csla.DataPortalClient.HttpProxy
和 <add key="CslaDataPortalUrl" value="http://www.someurl.net/WcfFullPortal.svc" />
到 <add key="CslaDataPortalUrl" value="http://www.someurl.net/DataPortal/PostAsync" />
并添加
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
HttpContext.Current.User = new Csla.Security.UnauthenticatedPrincipal();
}
在Global.asax.cs
我有一个带有 CSLA 的 WCF 项目,我已经在我的 IIS 服务器中发布了这个服务和 MVC 应用程序,但是当从 Web 应用程序调用该服务时它抛出了一个错误
System.ServiceModel.Security.SecurityNegotiationException: The caller was not authenticated by the service. ---> System.ServiceModel.FaultException: The request for security token could not be satisfied because authentication failed.
这是我的服务web.config
<system.serviceModel>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<services>
<service name="Csla.Server.Hosts.WcfPortal" behaviorConfiguration="returnFaults">
<endpoint binding="wsHttpBinding" bindingConfiguration="wsHttpBinding_IWcfPortal" contract="Csla.Server.Hosts.IWcfPortal" />
</service>
<service name="Csla.Server.Hosts.Mobile.WcfPortal" behaviorConfiguration="returnFaults">
<endpoint binding="basicHttpBinding" bindingConfiguration="basicHttpBinding_IWcfPortal" contract="Csla.Server.Hosts.Mobile.IWcfPortal" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="basicHttpBinding_IWcfPortal" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" maxBufferSize="2147483647">
<readerQuotas maxBytesPerRead="2147483647" maxArrayLength="2147483647" maxStringContentLength="2147483647" maxNameTableCharCount="2147483647" maxDepth="2147483647" />
</binding>
</basicHttpBinding>
<wsHttpBinding>
<binding name="wsHttpBinding_IWcfPortal" maxReceivedMessageSize="2147483647">
<readerQuotas maxBytesPerRead="2147483647" maxArrayLength="2147483647" maxStringContentLength="2147483647" maxNameTableCharCount="2147483647" maxDepth="2147483647" />
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="returnFaults">
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
我在我的 MVC web.config 中使用了这个服务,就像这样。
<add key="CslaAuthentication" value="Csla" />
<add key="CslaDataPortalProxy" value="Csla.DataPortalClient.WcfProxy, Csla" />
<add key="CslaDataPortalUrl" value="http://www.someurl.net/WcfFullPortal.svc" />
然后在我直接从我的服务项目调用服务后,一切正常。
<add key="CslaDataPortalUrl" value="http://localhost:11170/WcfFullPortal.svc" />
并且还尝试了已发布的 IP 地址,同样工作正常
<add key="CslaDataPortalUrl" value="http://10.4.56.75/WcfFullPortal.svc" />
只有当我使用已发布的主机名 (http://www.someurl.net/WcfFullPortal.svc) 时才会出现问题。我已经通过正在运行的浏览器打开了这个URL。
在 web.config <system.serviceModel>
部分的部分之后添加以下绑定配置。
<bindings>
<wsHttpBinding>
<binding name="TheBindingConfig">
<security mode="None" />
</binding>
</wsHttpBinding>
</bindings>
只需将 Csla.DataPortalClient.WcfProxy
更改为 Csla.DataPortalClient.HttpProxy
和 <add key="CslaDataPortalUrl" value="http://www.someurl.net/WcfFullPortal.svc" />
到 <add key="CslaDataPortalUrl" value="http://www.someurl.net/DataPortal/PostAsync" />
并添加
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
HttpContext.Current.User = new Csla.Security.UnauthenticatedPrincipal();
}
在Global.asax.cs