Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

WCFでファイルを送信する

WCFのクライアントからサービスへファイルを送信するサンプルです。

サービス側の実装

app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="myServiceBehavior" name="FileStorage.Storage">
        <endpoint address="" binding="basicHttpBinding" contract="FileStorage.IFileStorage" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000/Storage/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="myServiceBehavior">
          <serviceMetadata httpGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Program.cs ※間違えてクライアント側のソースをUpしていたのを修正。(2011/07/05)

using System;
using System.IO;
using System.ServiceModel;

namespace FileStorage {
    [ServiceContract]
    public interface IFileStorage {
        [OperationContract]
        void Upload(string fileName, byte[] contents);
    }

    public class Storage : IFileStorage {
        public void Upload(string fileName, byte[] contents) {
            File.WriteAllBytes(Path.Combine(@"d:\sandbox\filestorage", fileName), contents);
        }
    }

    public class Service {
        static void Main() {
            using(ServiceHost serviceHost = new ServiceHost(typeof(Storage))) {
                serviceHost.Open();
                Console.ReadLine();
            }
        }
    }
}

クライアント側の実装

Visual Studioのウィザードでプロキシクラスを作成する。

※サービスを実行状態にしておくこと。



プロキシクラスが作成される。

app.config(先のウィザードで自動作成される)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IFileStorage" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
          allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
          maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
          messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
          useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
              realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:8000/Storage/" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IFileStorage" contract="ServiceReference.IFileStorage"
        name="BasicHttpBinding_IFileStorage" />
    </client>
  </system.serviceModel>
</configuration>
Program.cs
using System.IO;
using FileUploader.ServiceReference;

namespace FileUploader {
    class Program {
        static void Main(string[] args) {
            using(FileStorageClient proxy = new FileStorageClient()) {
                const string SourceFilePathName = @"D:\Sandbox\temp\Hoge.txt";
                const string DestinationFileName = "Fuga.txt";
                proxy.Upload(DestinationFileName, File.ReadAllBytes(SourceFilePathName));
            }
        }
    }
}

ファイル送信のテスト

送信するファイルを準備する。
  • ファイルの配置場所

  • ファイルの内容
てすと

ほげテキストファイル→ふがテキストファイル
サービスを実行状態にしておく。
クライアントを実行する。
ファイルが送信されたことを確認する。
  • ファイルの送信先

  • ファイルの内容
てすと

ほげテキストファイル→ふがテキストファイル