我正在构建两个可以由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
将数据发送到服务似乎有点不合时宜。