0

ASP.NET MVC コントローラーまたは相互に使用できる 2 つの WCF サービスを構築しようとしています。

基本的に、サービスは別のサービスで使用できる (XML) DataContract を生成します。

A. OutputService1 はオブジェクトを出力し、InputService2 はそれを入力として受け取り、保存します。この場合、ユーザーは、MVC アプリ内のリンクをクリックして、メッセージ転送を強制します。

または

B. OutputService1 は、出力を ASP.NET MVC コントローラーに渡します。このコントローラーは、出力をファイルに入れ、ユーザーに渡して保存します。ユーザーは、近い将来、MVC アプリを介してそれを InputService2 にアップロードできます。

これまでのところ、2 つのサービスと .NET MVC アプリがあります。いくつかのシナリオをテストしましたが、結果には満足していません。

オブジェクトを送信する方法は次のとおりです。ビューの入力フォームは、コントローラーを介して REST をサポートする WCF に渡されます。<?xml version="1.0"?>REST を使用すると、OutputService1 の出力が含まれます。InputService2 は、その最初の行を除いた残りの XML のみを受け入れます。

REST WCF サービスは、次の例に似ています: http://forums.asp.net/t/1830710.aspx/1

IInputOutputService.cs

[OperationContract]
[WebInvoke(Method = "POST",
    ResponseFormat = WebMessageFormat.Xml,
    UriTemplate = "Input")]
ServiceRequestStatus Input(MyDataContract mdc);

Web.Config

  <service name="myns.InputOutputService">
    <endpoint address="/" binding="webHttpBinding" name="InputOutputEndPoint"
      contract="myns.IInputOutputService" behaviorConfiguration="restBehavior" />
    <endpoint address="mex" binding="mexHttpBinding" name="MetaDataExchangeEndpoint"
      contract="IMetadataExchange" />
  </service>
...
<endpointBehaviors>
  <behavior name="restBehavior">
    <webHttp helpEnabled="true" automaticFormatSelectionEnabled="true" />
  </behavior>
</endpointBehaviors>

.NET MVC 部分は、次の例に似ています: WCF RESTful を使用したオブジェクトの受け渡し

MVC MyView.cshtml

<form method="post" action='@Url.Action("TestWCFRest")'>
    <textarea name="xml" id="WCFTestData" rows="10" cols="50">        
        <?xml version="1.0"?>
        <MyDataContract xmlns="myns" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <item1>100</item1><item2>0.5</item2>
        </MyDataContract>
    </textarea>
    <br />        
    <input id="Url" name="Url" type="text" value="http://localhost/ProjectName/WCFTestService.svc/Input" size="80" />
    <input type="submit" value="Test WCF input"/>
</form>

.NET MVC MyController.cs

    // Added to avoid validating the XML 
    [ValidateInput(false)]
    public ActionResult TestWCFRest(string xml, string url)
    {

        byte[] reqData = Encoding.UTF8.GetBytes(xml);

        HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest;
        req.Method = "POST";
        req.ContentType = " application/xml";
        req.ContentLength = xml.Length;
        req.Proxy = null;
        Stream reqStream = req.GetRequestStream();
        reqStream.Write(reqData, 0, reqData.Length);

        HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
        string code = resp.StatusCode.ToString();
        return Content(code);
    }

ServiceReference を WCF サービスに追加しようとして、XML を MVC 内の datacontract に変換しようとすると、これは可能ですか、それとも悪い考えですか?

    public ActionResult TestWCFRest(string xml, string url)
    {
        InputOutputServiceClient iosc = new InputOutputServiceClient();
        // Need to convert the XML to MyDataContract
        ...?
        iosc.Input(myDataContractObj);
    }

SOAP の代わりに REST を使用する必要がありますか? OutputService1 から DataContract クラスを SOAP 経由で出力してから、InputService2 を使用して手動で送信しようとしましHttpWebRequest and HttpWebResponseたが、(まだ) 動作しませんでした。ユーザーが取得するファイルは必ずしも人間が読める形式である必要はありませんが、それが重要な場合、サービスはある時点で外部クライアントに対して開かれている可能性があります。

.NET MVC および WCF サービスを使用するためのより良い方法はありますか? 主なテーマは、InputService と OutputService の 2 つのサービスが、MVC でユーザーを介してコマンドを実行したときに相互に直接通信する必要があること、および出力を直接ユーザー (XML ファイル) に出力し、同じファイルをファイルとして取得できることです。入力。

基本的に、このアプローチは、出力された XML の余分な行以外は機能します。しかし、より良い方法はありますか? XML を DataContract オブジェクトに変換してユーザーに渡す必要がありますか? OutputService は SOAP または REST XML を出力するのが望ましいですか? HttpWebRequest and HttpWebResponseデータをサービスに送信するために使用するのは少し面倒です。

4

0 に答える 0