在 WCF 服务中设置绑定

Posted

技术标签:

【中文标题】在 WCF 服务中设置绑定【英文标题】:Setting binding in WCF service 【发布时间】:2012-11-18 20:56:21 【问题描述】:

这似乎是一个非常简单的问题,但我似乎根本无法弄清楚。

我正在尝试创建一个新的 WCF 服务,但我不知道必须保护它们。我正在使用自定义用户名/密码进行身份验证。我似乎遇到的问题 [无论如何现在] 是我无法弄清楚如何定义服务以使用 WSHttpBinding(在服务端,而不是客户端)。

我错过了一些非常简单的东西吗?任何指针和/或建议将不胜感激!

编辑

到目前为止,这是我的代码: IAccountService

[ServiceContract]
public interface IAccountService

    [OperationContract]
    bool IsCardValid(string cardNumber);

    [OperationContract]
    bool IsAccountActive(string cardNumber);

    [OperationContract]
    int GetPointBalance(string cardNumber);

服务 web.config

<system.serviceModel>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <!-- To avoid disclosing metadata information, set the value below to false before deployment -->
      <serviceMetadata httpGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="false"/>

      <StructureMapServiceBehavior />
    </behavior>
  </serviceBehaviors>
</behaviors>
<extensions>
  <behaviorExtensions>
    <add name="StructureMapServiceBehavior" type="Marcus.Loyalty.WebServices.Setup.StructureMapServiceBehavior, Marcus.Loyalty.WebServices, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </behaviorExtensions>
</extensions>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
<services>
  <service name="Marcus.Loyalty.WebServices.Account.IAccountService">
    <endpoint address=""
      binding="wsHttpBinding"
      bindingConfiguration="WSHttpBinding_Config"
      contract="Marcus.Loyalty.WebServices.Account.IAccountService"/>
  </service>
</services>
<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_Config"/>
  </wsHttpBinding>
</bindings>
</system.serviceModel>

测试应用(控制台应用)

class Program

    static void Main(string[] args)
    
        Console.WriteLine("Please enter card number");
        var number = Console.ReadLine();

        var endPoint = new EndpointAddress("http://localhost:59492/Account/AccountService.svc");
        var binding = new WSHttpBinding(SecurityMode.Message);
        binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

        var cf = new ChannelFactory<IAccountService>(binding, endPoint);
        cf.Credentials.UserName.UserName = "testuser";
        cf.Credentials.UserName.Password = "Password1!";

        var service = cf.CreateChannel();
        var balance = service.IsAccountActive(number);

        Console.WriteLine("\nBALANCE: 0:#,#", balance);

        Console.Write("\n\nPress Enter to continue");

        Console.Read();
    

测试应用 app.config

<configuration>

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="BasicHttpBinding_IAccountService" />
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:59492/Account/AccountService.svc"
            binding="wsHttpBinding" bindingConfiguration="BasicHttpBinding_IAccountService"
            contract="ServiceReference1.IAccountService" name="BasicHttpBinding_IAccountService" />
    </client>
</system.serviceModel>
</configuration>

【问题讨论】:

google.co.uk/… 你有配置文件吗? WCF 中的很多东西都可以在 config 中定义 @marc_s - 我没有,我希望在代码中定义这部分,但如果你能提供一个示例,我会做任何工作:) 我认为您缺少基址 【参考方案1】:

需要在de web.config文件中定义abc(地址,绑定,合约)配置(也可以通过程序来实现。b部分,绑定,可以指定wsHttpBinding

<system.serviceModel>
    <services>
        <service name = "MyNamespace.MyService">
            <endpoint
            address = "http://localhost:8000/MyService"
            binding = "wsHttpBinding"
            contract = "MyNamespace.IMyContract" />
        </service>
    </services>
</system.serviceModel>

如果您希望以适当的方式启用安全性,有很多文献和选项。您可以使用证书、基于 Windows 的令牌、...像参数一样传递用户名和密码并不是最好的方法。

【讨论】:

【参考方案2】:

MSDN 上有大量示例 (How to: Specify a Service Binding in code) - 但基本上,您需要:

您的服务合同 (IMyService) 该服务的实现 (MyService) 用于创建 ServiceHost 以托管服务的代码

这些你都知道了吗?太好了!

在这种情况下,只需执行以下操作:

// Specify a base address for the service
string baseAddress = "http://YourServer/MyService";

// Create the binding to be used by the service.
WsHttpBinding binding1 = new WsHttpBinding();

using(ServiceHost host = new ServiceHost(typeof(MyService)))

    host.AddServiceEndpoint(typeof(IMyService), binding1, baseAddress);

    host.Open();

    Console.ReadLine();
    

现在您应该在您选择的基地址上启动并运行您的服务主机,并在代码中定义wsHttpBinding

【讨论】:

我唯一不确定的(对 WCF 相当陌生)是您正在谈论的 ServiceHost。这是指托管服务的应用程序吗?另外,我现在遇到的错误是:Content Type application/soap+xml; charset=utf-8 was not supported by serviceThanks! @mmillican: 是的,ServiceHost 是您在应用程序中需要“托管”服务的类。如果您使用 IIS 来托管您的 WCF 服务 - 在这种情况下,您必须创建 ServiceHostFactory 的后代,以便能够向托管您的服务的 IIS 提供您自己的自定义版本的 ServiceHost。听起来很复杂——实际上并不复杂——请参阅 Extending Hosting Using ServiceHostFactory 了解如何操作

以上是关于在 WCF 服务中设置绑定的主要内容,如果未能解决你的问题,请参考以下文章

在 wcf 服务中设置 cookie

在 WCF 项目中设置 Web API

在 sharepoint 中设置流式 WCF 服务

WCF 多重绑定 - 错误:没有端点监听

在 Web 应用程序中设置 WCF TCP 服务

在 App.config 中设置 WCF ClientCredentials