多个 HTTPS 和 HTTP WCF 端点错误
Multiple HTTPS and HTTP WCF endpoints error
我正在尝试配置 WCF 项目以同时使用 HTTPS 和 HTTP。
我已经设法让它在我的服务器上运行(HTTPS 和 HTTP)——当我远程调试时(使用 Chrome 的扩展 "Advanced Rest Client")完美运行,但是我在我的本地主机环境中不断收到“错误 500 System.ServiceModel.ServiceActivationException”。
我附上了我的代码,请注意,我只是尝试更改 "Behavior_Users"(只是想弄清楚),但我确实需要这个 HTTP + HTTPS 功能对于我所有的接口。
这是我的Web.config:
<bindings>
<webHttpBinding>
<binding name="basicWebBinding">
<security mode="None">
<transport clientCredentialType="None" />
</security>
</binding>
<binding name="secureWebBinding">
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true" httpsHelpPageEnabled="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="Behavior_Users">
<webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Bare"/>
</behavior>
</endpointBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpBinding" scheme="http"/>
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
<services>
<service name="TakesApp.MainWCF.Users">
<endpoint behaviorConfiguration="Behavior_Users" binding="webHttpBinding" bindingConfiguration="basicWebBinding" contract="TakesApp.MainWCF.IUsers">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint behaviorConfiguration="Behavior_Users" binding="webHttpBinding" bindingConfiguration="secureWebBinding" contract="TakesApp.MainWCF.IUsers">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
</service>
</services>
</system.serviceModel>
</configuration>
这是我的方法:
[OperationContract]
[WebInvoke(Method = "*", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
System.ServiceModel.Channels.Message Register(Stream body);
希望大家能帮帮我,我找了两天都没有找到正确答案。
非常感谢!!!
更新:仍然没有。考虑简单地给它一个不同的调试和发布配置。我尝试了每种配置组合。当托管在服务器上时,它可以同时使用 HTTPS 和 HTTP,但它会在我的本地主机环境中故障转移 POST。 WCF 糟透了。
好的,所以我发现这是一个已知的 WCF 错误,特别是在我使用 IIS Express 的调试环境中。
我尝试使用 web.config 转换(将特定的 HTTPS 端点添加到 web.release.config)来解决它,但它也有一个严重的错误,阻止您更改除第一个设置之外的任何内容。
WCF 对于 2015 年标准中的简单网络外观来说太复杂了。
无论如何,我所做的是根据环境(生产与否)以编程方式在运行时设置 HTTPS 端点。
我在 global.asax 中添加了一个新的服务器主机工厂:
public class ExtendedServiceHostFactory : WebServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
//Add host
WebServiceHost host = (WebServiceHost)base.CreateServiceHost(serviceType, baseAddresses);
host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
//Add HTTP endpoint
ServiceEndpoint httpEndpoint = host.AddServiceEndpoint(serviceType.GetInterfaces()[0], new WebHttpBinding(WebHttpSecurityMode.None), string.Empty);
httpEndpoint.Behaviors.Add(new WebHttpBehavior());
//Add HTTPS endpoint
if (ToolBox.IsProduction()) //My proprietary indication for environment type, replace with yours
{
ServiceEndpoint httpsEndpoint = host.AddServiceEndpoint(serviceType.GetInterfaces()[0], new WebHttpBinding(WebHttpSecurityMode.Transport), string.Empty);
httpsEndpoint.Behaviors.Add(new WebHttpBehavior());
}
return host;
}
}
然后我用这个扩展注册了一个服务(在Application_Start):
//Routing
RouteTable.Routes.Add(
new ServiceRoute(
"Users", new ExtendedServiceHostFactory(),
typeof(Users)));
现在这显然有效。
我正在尝试配置 WCF 项目以同时使用 HTTPS 和 HTTP。
我已经设法让它在我的服务器上运行(HTTPS 和 HTTP)——当我远程调试时(使用 Chrome 的扩展 "Advanced Rest Client")完美运行,但是我在我的本地主机环境中不断收到“错误 500 System.ServiceModel.ServiceActivationException”。
我附上了我的代码,请注意,我只是尝试更改 "Behavior_Users"(只是想弄清楚),但我确实需要这个 HTTP + HTTPS 功能对于我所有的接口。
这是我的Web.config:
<bindings>
<webHttpBinding>
<binding name="basicWebBinding">
<security mode="None">
<transport clientCredentialType="None" />
</security>
</binding>
<binding name="secureWebBinding">
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true" httpsHelpPageEnabled="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="Behavior_Users">
<webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Bare"/>
</behavior>
</endpointBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpBinding" scheme="http"/>
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
<services>
<service name="TakesApp.MainWCF.Users">
<endpoint behaviorConfiguration="Behavior_Users" binding="webHttpBinding" bindingConfiguration="basicWebBinding" contract="TakesApp.MainWCF.IUsers">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint behaviorConfiguration="Behavior_Users" binding="webHttpBinding" bindingConfiguration="secureWebBinding" contract="TakesApp.MainWCF.IUsers">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
</service>
</services>
</system.serviceModel>
</configuration>
这是我的方法:
[OperationContract]
[WebInvoke(Method = "*", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
System.ServiceModel.Channels.Message Register(Stream body);
希望大家能帮帮我,我找了两天都没有找到正确答案。
非常感谢!!!
更新:仍然没有。考虑简单地给它一个不同的调试和发布配置。我尝试了每种配置组合。当托管在服务器上时,它可以同时使用 HTTPS 和 HTTP,但它会在我的本地主机环境中故障转移 POST。 WCF 糟透了。
好的,所以我发现这是一个已知的 WCF 错误,特别是在我使用 IIS Express 的调试环境中。
我尝试使用 web.config 转换(将特定的 HTTPS 端点添加到 web.release.config)来解决它,但它也有一个严重的错误,阻止您更改除第一个设置之外的任何内容。
WCF 对于 2015 年标准中的简单网络外观来说太复杂了。
无论如何,我所做的是根据环境(生产与否)以编程方式在运行时设置 HTTPS 端点。
我在 global.asax 中添加了一个新的服务器主机工厂:
public class ExtendedServiceHostFactory : WebServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
//Add host
WebServiceHost host = (WebServiceHost)base.CreateServiceHost(serviceType, baseAddresses);
host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
//Add HTTP endpoint
ServiceEndpoint httpEndpoint = host.AddServiceEndpoint(serviceType.GetInterfaces()[0], new WebHttpBinding(WebHttpSecurityMode.None), string.Empty);
httpEndpoint.Behaviors.Add(new WebHttpBehavior());
//Add HTTPS endpoint
if (ToolBox.IsProduction()) //My proprietary indication for environment type, replace with yours
{
ServiceEndpoint httpsEndpoint = host.AddServiceEndpoint(serviceType.GetInterfaces()[0], new WebHttpBinding(WebHttpSecurityMode.Transport), string.Empty);
httpsEndpoint.Behaviors.Add(new WebHttpBehavior());
}
return host;
}
}
然后我用这个扩展注册了一个服务(在Application_Start):
//Routing
RouteTable.Routes.Add(
new ServiceRoute(
"Users", new ExtendedServiceHostFactory(),
typeof(Users)));
现在这显然有效。