C#(二)—— WPF内嵌WCF提供外部接口

caroly 2020年05月10日 159次浏览

因项目需求需要写一个接口供其它设备调用,又因项目本身基于WPF,所以内嵌WCF服务是一个不错的方法。


以管理员权限运行『VS』,新建一个『WPF』项目,在项目中添加新建项,选择『WCF服务』。

注:wcf运行需要更加高级的权限,一般的解决方法是以管理员身份运行vs或应用程序。通过普通用户注册URL也可以运行:以管理员身份打开dos窗口,输入以下命令:netsh http add urlacl url=http://+:8000/Service user=xxxxx ,这样用户xxxxx就可以开启此路径下的wcf服务,无需管理员身份。仅限于单工模式(http)和全双工(tcp)的wcf服务。

添加wcf服务

添加完成后,项目中会多出两个『cs』文件:一个是供外部调用的接口,另一个是接口的实现。

需要在项目中添加两个引用:『System.ServiceModel』『System.ServiceModel.Web』

添加引用


项目的『App.config』配置文件中会出现『WCF』的相关配置信息。

将『system.serviceModel』节点中的内容替换成以下内容:

注:主要是将service name和contract以及add baseAddress替换成自己的。

<system.serviceModel>
    <services>
      <service name="chubby.ProgramService" behaviorConfiguration="default">
        <endpoint address="" behaviorConfiguration="webHttp" binding="webHttpBinding" bindingConfiguration="general" contract="chubby.ProgramIService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/Service"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="webHttp">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="default">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceThrottling maxConcurrentCalls="256" maxConcurrentSessions="1024" maxConcurrentInstances="1024"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding name="general" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:01:00" sendTimeout="00:01:00" maxReceivedMessageSize="4194304" maxBufferSize="4194304" maxBufferPoolSize="33554432">
          <readerQuotas maxDepth="32" maxArrayLength="16384" maxStringContentLength="16384" maxBytesPerRead="8192" maxNameTableCharCount="65536"/>
          <security mode="None">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
  </system.serviceModel>

此时已完成基本配置,接下来需要写接口以及启动服务。

在『App.xaml.cs』中写入以下代码:

public static ServiceHost host = null;
public App()
{
    host = new ServiceHost(typeof(ProgramService));
    host.Open();
}

public static void AppClose()
{
    if(host!= null)
    {
        host.Close();
    }
}

其中,『ProgramService』是接口的实现类。

这样在程序启动的时候即可开启服务,程序关闭的时候亦可以释放资源。


接口部分是返回参数值。

[ServiceContract]
public interface ProgramIService
{
    [OperationContract, WebGet(UriTemplate = "test?key={value}", ResponseFormat = WebMessageFormat.Json)]
    string DoWork(string value);
}

主窗体部分简单的放了一个媒体播放器以及动态图。

<Window x:Class="chubby.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:gif="https://github.com/XamlAnimatedGif/XamlAnimatedGif"
        xmlns:local="clr-namespace:chubby"
        mc:Ignorable="d"
        Title="MainWindow" Height="500" Width="500" Topmost="True">

    <Grid Background="Black">
        <MediaElement x:Name="mediaElement" LoadedBehavior="Manual" MediaEnded="MediaPlayer_MediaOpened" Stretch="Fill" Visibility="Visible"/>

        <Image x:Name="imageGif" gif:AnimationBehavior.SourceUri="/Image/FirstGif.gif" Stretch="Fill" Visibility="Visible"/>
    </Grid>
</Window>


启动程序。在『Postman』中访问这个接口并传入参数。

注:Postman是英文版,对于英文接触不深的人来说,可以选择Apizza,基本就是汉化版的Postman。

调用接口

通过更改『key』的值在窗体中显示不同的『Gif』动态图或者『MP4』视频。


项目托管在Github中。