在WPF应用程序内部托pipeWCF Web服务

我正在开发一个WPF应用程序。 作为应用程序的一部分,我需要通过另一个iOS应用程序接收一些图像。 所以我写了WCF REST服务和iOS,并且只有在将服务定义为IIS的一部分时,才能将图像发送到Web服务。
我需要发生的事情是:当WPF应用程序启动时,Web服务也将启动,并公开iOS设备的端口号以发送图像,并在启动时“唤醒”WPF应用程序。 有什么想法吗?

是的,我做到了。 其实就像Tim提到的,那正是我自己做的托pipe服务。 你可以看看下面的video(还有很多其他的,看看链接)。 http://channel9.msdn.com/shows/Endpoint/endpointtv-Screencast-Building-RESTful-Services-with-WCF/

下面是我的WCF项目中的完整文件:(如电影中提到的),我希望它能让你开始。只需要注意,在你机器上打开一个特定的端口来启用传入的HTTP通信也是很重要的。 看看WCF ServiceHost访问权限 。

Eval.cs

[DataContract] public class Eval { public string id; [DataMember] public string Submitter; [DataMember] public DateTime Timesent; [DataMember] public string Comments; } 

IEvalService.cs

 [ServiceContract] public interface IEvalService { [WebInvoke(Method="POST", UriTemplate = "evals")] [OperationContract] void SubmitEval(Eval i_Eval); [WebGet(UriTemplate = "evals")] [OperationContract] List<Eval> GetEvals(); [WebGet(UriTemplate="eval/{i_Id}")] [OperationContract] Eval GetEval(string i_Id); [WebGet(UriTemplate = "evals/{i_Submitter}")] [OperationContract] List<Eval> GetEvalsBySubmitters(string i_Submitter); [WebInvoke(Method = "DELETE", UriTemplate = "eval/{i_Id}")] [OperationContract] void RemoveEval(string i_Id); [WebGet(UriTemplate = "GetLastPhoto", BodyStyle = WebMessageBodyStyle.Bare)] Stream GetLastPhoto(); [OperationContract] // this web address is for receiving the image for the iOS app. [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "TestPost")] string TestPost(Stream stream); } 

EvalService.cs

 [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] public class EvalService : IEvalService { private List<Eval> m_Evals = new List<Eval>(); private int evalCount = 0; private string k_FilePath = "C:\\ImageUpload\\"; public static event Action<LogicImage> ImageLoaded; public void SubmitEval(Eval i_Eval) { i_Eval.id = (++evalCount).ToString(); m_Evals.Add(i_Eval); } public List<Eval> GetEvals() { return m_Evals; } public Eval GetEval(string i_Id) { return m_Evals.First(e => e.id.Equals(i_Id)); } public List<Eval> GetEvalsBySubmitters(string i_Submitter) { if (i_Submitter == null && i_Submitter.Equals("")) { return null; } else { return m_Evals.Where(e => e.Submitter == i_Submitter).ToList(); } } public void RemoveEval(string i_ID) { throw new NotImplementedException(); } public Stream GetLastPhoto() { Image image = Image.FromFile("C:\\ImageUpload\\014.png"); MemoryStream ms = new MemoryStream(imageToByteArray(image)); return ms; } public string TestPost(Stream stream) { HttpMultipartParser parser = new HttpMultipartParser(stream, "image"); if (parser.Success) { if (parser.Success) { // deal with exceptions.. // File.WriteAllBytes(k_FilePath + parser.Filename, parser.FileContents); if (ImageLoaded != null) { ImageLoaded.Invoke(new LogicImage(){FileName = parser.Filename, Location = k_FilePath}); } } } return "test"; } public static byte[] imageToByteArray(System.Drawing.Image imageIn) { MemoryStream ms = new MemoryStream(); imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png); return ms.ToArray(); } } public class LogicImage { public string FileName { get; set; } public string Location { get; set; } } 

最后但并非最不重要** App.config **

 <?xml version="1.0"?> <configuration> <system.web> <compilation debug="true"/> </system.web> <!-- When deploying the service library project, the content of the config file must be added to the host's app.config file. System.Configuration does not support config files for libraries. --> <system.serviceModel> <services> <service name="ImageRecevierWebService.EvalService"> <host> <baseAddresses> <add baseAddress="http://localhost:8732/Design_Time_Addresses/ImageRecevierWebService/Service1/"/> </baseAddresses> </host> <!-- Service Endpoints --> <!-- Unless fully qualified, address is relative to base address supplied above --> <endpoint address="" binding="wsHttpBinding" contract="ImageRecevierWebService.IEvalService"> <!-- Upon deployment, the following identity element should be removed or replaced to reflect the identity under which the deployed service runs. If removed, WCF will infer an appropriate identity automatically. --> <identity> <dns value="localhost"/> </identity> </endpoint> <!-- Metadata Endpoints --> <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --> <!-- This endpoint does not use a secure binding and should be secured or removed before deployment --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior> <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> <serviceMetadata httpGetEnabled="True"/> <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> <serviceDebug includeExceptionDetailInFaults="False"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>