(.NET)MVC和WCF(REST与SOAP)并一起使用它们

时间:2012-11-22 09:34:11

标签: asp.net-mvc wcf rest soap

我正在构建两个可以由ASP.NET MVC控制器或彼此使用的WCF服务。

本质上,该服务将生成一个(XML)DataContract,可由另一个服务使用。

  

一个。 OutputService1将输出一个对象,InputService2将其作为输入并保存。在这种情况下,用户将例如单击中的链接   MVC应用程序强制传输邮件。

或者

  

B中。 OutputService1将输出提供给ASP.NET MVC控制器,然后将其放入文件并将其提供给用户进行保存。然后,用户可以在不久的将来通过MVC应用程序将其上传到InputService2。

到目前为止,我有两个服务和.NET MVC应用程序。我已经测试了几个场景,我对结果不太满意。

以下是我能够通过发送对象的方式。 View中的输入表单然后通过控制器传递给支持REST的WCF。使用REST时,OutputService1的输出包括<?xml version="1.0"?>。 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部分与此示例类似:Passing object with 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内的数据提取,这可能是一个坏主意还是一个坏主意?

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

我应该使用REST而不是SOAP吗?我尝试通过SOAP从OutputService1输出DataContract类,然后使用HttpWebRequest and HttpWebResponse手动将其发送到InputService2但尚未使其工作(尚未)。用户获取的文件不一定需要是人类可读的,但如果重要的话,服务可能会在某些时候对外部客户开放。

使用.NET MVC和WCF服务有更好的方法吗?主要的主题是两个服务InputService和OutputService需要在MVC中通过用户命令时直接相互通信,并且能够将输出直接输出给用户(XML文件)并将相同的文件作为输入。

基本上,这种方法在XML输出的额外行之外工作。但是,有没有更好的方法,XML应该转换为DataContract对象并传递给用户吗? OutputService应该优选输出SOAP还是REST XML?使用HttpWebRequest and HttpWebResponse将数据发送到服务似乎有点不合时宜。

0 个答案:

没有答案