3

添付ファイル付きの電子メールを送信できる Web サービスと、シリアル化に wcf と mtom を使用するクライアントを開発する必要があります。私は自分の仕事に次のツールを使用しています。

Windows 7 Professional x64 Microsoft Visual Studio 2012 Microsoft Development Server/ IIS Express 8.0 ユーザー: 管理者

メッセージ コントラクトの自己定義クラスを使用してクライアントで Web サービスを使用しようとするたびに、「への HTTP 応答を受信中にエラーが発生しましたhttp://localhost:2364/Service1.svc。サービス エンドポイント バインディングが HTTP プロトコルを使用していないことが原因である可能性があります。 This could also be due to a HTTP request context being aborted by the server (possible due to the service shutdowning). 詳細については、サーバー ログを参照してください。

ここで、単純なテスト サービスと単純なテスト クライアントをセットアップしてみます。次のことを試してみましたが、常に同じエラーが発生しますが、リクエストとレスポンスで単純な文字列を使用するだけの Web サービスのメソッドを使用すると、エラーが発生せずに非常にうまく機能します。

  1. Visual Studio 2012 および IIS Express 8.0 から統合された Microsoft Development Server で同じエラーが発生する

  2. クライアントとサービスの構成で basicHttpBinding または wHttpBinding を使用すると同じエラーが発生する

  3. 両方のサーバーでログ ファイルを生成しようとしました。IIS Express サーバーは、構成ファイルからの設定ではなく、構成されていない別のフォルダーにいくつかのログを生成します。Microsoft Development Server は何も生成しません。

  4. svctraceviewer.exe を使用して生成されたいくつかのログ ファイルを監視したところ、オペコード MODULE_SET_RESPONSE_ERROR_STATUS でいくつかの警告が表示されました。この情報を理解できません。

  5. 指定されたフォルダーに対して localService および networkService の読み取り/書き込み許可を有効にしようとしましたが、結果はありませんでした。

  6. RawCap を使用してローカルホストをスニッフィングし、wireshark で結果を監視しようとしましたが、出力ファイルに 0 バイトがあります (これは別の問題に違いありません)。

さらに情報が必要な場合はお知らせください。

ありがとうございました!

以下は、サービスとクライアントのコードと構成です (テスト用のみ)。

サービス: IService1.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.IO;

namespace WcfTestService
{

[ServiceContract]
public interface IService1
{

    [OperationContract]
    string GetData(int value);

    /*
    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);*/

    // TODO: Hier Dienstvorgänge hinzufügen

    [OperationContract]
    ServiceResponse TestCase(ServiceRequest testRequest);
}

/*
// Verwenden Sie einen Datenvertrag, wie im folgenden Beispiel dargestellt, um Dienstvorgängen zusammengesetzte Typen hinzuzufügen.
[DataContract]
public class CompositeType
{
    bool boolValue = true;
    string stringValue = "Hello ";

    [DataMember]
    public bool BoolValue
    {
        get { return boolValue; }
        set { boolValue = value; }
    }

    [DataMember]
    public string StringValue
    {
        get { return stringValue; }
        set { stringValue = value; }
    }
}*/

[MessageContract]
public class ServiceRequest
{
    [MessageHeader]
    public String Type { get; set; }

    [MessageBodyMember]
    public Stream Contents { get; set; }
}

[MessageContract]
public class ServiceResponse
{
    [MessageHeader]
    public String Type { get; set; }

    [MessageBodyMember]
    public Stream Contents { get; set; }
}
}

サービス: web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>

<system.diagnostics>
<sources>
  <source name="System.ServiceModel.MessageLogging"  switchValue="Ausführlich,ActivityTracing">
    <listeners>
      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
        <filter type="" />
      </add>
      <add name="ServiceModelMessageLoggingListener">
        <filter type="" />
      </add>
    </listeners>
  </source>
  <source propagateActivity="true" name="System.ServiceModel" switchValue="Ausführlich,ActivityTracing">
    <listeners>
      <add type="System.Diagnostics.DefaultTraceListener" name="Default">
        <filter type="" />
      </add>
      <add name="ServiceModelTraceListener">
        <filter type="" />
      </add>
    </listeners>
  </source>
</sources>
<sharedListeners>
  <add initializeData="d:\log\web_messages.svclog"
    type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
    name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
    <filter type="" />
  </add>
  <add initializeData="d:\log\web_tracelog.svclog"
    type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
    name="ServiceModelTraceListener" traceOutputOptions="Timestamp">
    <filter type="" />
  </add>
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<!--httpRuntime targetFramework="4.5"/>-->
<httpRuntime targetFramework="4.5" maxRequestLength="102400" executionTimeout="7200"/>
</system.web>
<system.serviceModel>
<diagnostics>
  <messageLogging logEntireMessage="true" logKnownPii="true" logMalformedMessages="true"
    logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
  <endToEndTracing propagateActivity="true" activityTracing="true"
    messageFlowTracing="true" />
</diagnostics>
<bindings>
  <basicHttpBinding>
    <binding name="basicHttpMtomBinding" closeTimeout="10:01:00"
      openTimeout="10:01:00" receiveTimeout="10:10:00" sendTimeout="10:01:00"
      transferMode="Streamed" messageEncoding="Mtom">
      <readerQuotas maxDepth="1000" maxStringContentLength="1000" maxArrayLength="1000"
        maxBytesPerRead="1000" maxNameTableCharCount="1000" />
    </binding>
  </basicHttpBinding>
  <wsHttpBinding>
    <binding name="wsHttpMtomBinding" closeTimeout="10:01:00" openTimeout="10:01:00"
      receiveTimeout="10:10:00" sendTimeout="10:01:00" maxBufferPoolSize="999999999"
      maxReceivedMessageSize="1048576" messageEncoding="Mtom"
useDefaultWebProxy="true">
      <readerQuotas maxDepth="100" maxStringContentLength="1000" maxArrayLength="1000"
        maxBytesPerRead="100000" maxNameTableCharCount="1000" />
      <reliableSession inactivityTimeout="10:10:00" />
      <security mode="None" />
    </binding>
  </wsHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
<protocolMapping>
  <remove scheme="http" />
  <add scheme="http" binding="wsHttpBinding" bindingConfiguration="wsHttpMtomBinding" />
  <add scheme="https" binding="basicHttpsBinding" />
</protocolMapping>    
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
    Um das Stammverzeichnis der Webanwendung beim Debuggen auszuwählen, legen Sie den Wert unten auf "true" fest.
    Legen Sie ihn vor der Bereitstellung auf "false" fest, um die Veröffentlichung von Informationen über den Webanwendungsordner zu vermeiden.
  -->
<directoryBrowse enabled="true"/>
</system.webServer>

</configuration>

クライアント: app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="WSHttpBinding_IService1" messageEncoding="Mtom">
                <security mode="None" />
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:2364/Service1.svc" binding="wsHttpBinding"
            bindingConfiguration="WSHttpBinding_IService1" contract="ServiceReference1.IService1"
            name="WSHttpBinding_IService1">
            <identity>
                <userPrincipalName value="Ares\Admin" />
            </identity>
        </endpoint>
    </client>
</system.serviceModel>
</configuration>

クライアント: Form1.cs

     ...

        private void button1_Click(object sender, EventArgs e)
    {

        ServiceReference1.IService1 testService = new ServiceReference1.Service1Client();
        ServiceReference1.ServiceRequest testInput = new ServiceReference1.ServiceRequest();
        ServiceReference1.ServiceResponse testOutput = new ServiceReference1.ServiceResponse();

        BinaryFormatter formatter = new BinaryFormatter();
        MemoryStream inoutStream = new MemoryStream();

        testInput.Type = "TestType";
        String test = "TestContent";
        testInput.Contents = new MemoryStream();
        formatter.Serialize(testInput.Contents, test);
        //testInput.Contents.Position = 0;

        testService.TestCase(testInput);


        MessageBox.Show("Done!");

    }

    ...
4

1 に答える 1

0

web.config にサービス構成データが表示されません (エンドポイントなど)。

    <services>
      <service behaviorConfiguration="..." name="[Namespace].Service1">
        <endpoint address="" binding="basicHttpBinding" bindingNamespace="..." bindingConfiguration="..." contract="[Namespace].IService1">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
             <add baseAddress="http://localhost:5000/Service1"/>
...

エンドポイントは実行時に (基本的にセルフホステッド サービスで) 構成できますが、単純なシナリオと IIS インフラストラクチャの場合は...?

http://msdn.microsoft.com/en-us/library/ee354381.aspxを参照してください

于 2012-11-27T10:01:28.647 に答える