我一直在看MSDN和codeproject,但我仍然有些困惑。

同步服务与异步服务。

我有一个WCF服务端点。 此服务对其web.config文件应用了2way SSL。 客户端端点是基于Oracle的Java Weblogic Suite。 它具有自己的私钥和公钥。 客户需要异步和同步地与我们的服务进行通信。

我只能更改服务器端的内容

http://www.codeproject.com/Articles/91528/How-to-Call-WCF-Services-Synchronously-and-Asynchr

http://msdn.microsoft.com/en-us/library/ms731177.aspx

以下代码是SVC cs文件的同步部分:

public getQuoteSyncResponse1 getQuoteSync(getQuoteSyncRequest request)
     {
        // Create new response
        getQuoteSyncResponse1 res = new getQuoteSyncResponse1();

        res.GetQuoteSyncResponse = new GetQuoteSyncResponse();
        res.GetQuoteSyncResponse.Header = new GetQuoteResponseHeaderType();
        res.GetQuoteSyncResponse.Response = new GetQuoteSyncResponseType();

        // Create and populate header
        res.GetQuoteSyncResponse.Header.MessageId = request.GetQuoteRequestSync.Header.MessageId;
        res.GetQuoteSyncResponse.Header.Timestamp = request.GetQuoteRequestSync.Header.Timestamp;
        res.GetQuoteSyncResponse.Header.QuoteId = request.GetQuoteRequestSync.Header.QuoteId;
        res.GetQuoteSyncResponse.Header.CarrierId = request.GetQuoteRequestSync.Header.CarrierId;


        List<RejectionType> rj = new List<RejectionType>();


        string _sTotalEmployees = request.GetQuoteRequestSync.Request.Employer.TotalEmployees;
        int _TotalEmployees = 0;
        if (int.TryParse(_sTotalEmployees, out _TotalEmployees) == false)
        {


            RejectionType rt;
            rt = new RejectionType();
            rt.ReasonCode = "R01";
            rt.ReasonDescription = "Invalid Number of Employees";

            rj.Add(rt);

            res.GetQuoteSyncResponse.Response.Rejections = rj.ToArray();

            res.GetQuoteSyncResponse.Response.ReceiptStatus = AcceptanceContentType.Reject;

            return res;
        }

        res.GetQuoteSyncResponse.Response.ReceiptStatus = AcceptanceContentType.Success;

        List<QuoteType> q = new List<QuoteType>();

        QuoteType qt;

        qt = new QuoteType();
        qt.PlanId = "P345678";
        qt.EEPremium = 1220;
        qt.EESPPremium = 2222;
        qt.EEDepPremium = 3333;
        qt.EEFamilyPremium = 4444;
        qt.TotalMonthlyPremium = 3456;
        qt.CoverageEffectiveDate = DateTime.Now;

        q.Add(qt);

        res.GetQuoteSyncResponse.Response.Quotes = q.ToArray();

        return res;}

因此该服务的同步部分正在运行。 现在,如何使用它来将其转换为异步等效项?

我应该在CS文件中启动异步方法吗? 还是在svc文件中? 我很困惑...

 public getQuoteAsyncResponse getQuoteAsync(getQuoteAsyncRequest request, AsyncCallback callback, Object state)
    {
        // Create new response
        getQuoteAsyncResponse res = new getQuoteAsyncResponse();

        return new getQuoteAsyncResponse();
    }

我对回调定义程序,对象状态等有所了解,但是有人可以为我进一步说明吗? 如何格式化服务的异步部分? 网路上有很多例子...但都非常令人困惑。 我必须对此概念有一些固有的误解。

编辑:-在回答中有人告诉我,服务器端不需要异步通信方式的操作。 但是我发现了这一点:

在WCF中实现异步操作正如WCF管道使客户端可以异步调用服务器操作,而服务器无需了解任何信息一样,WCF还允许异步定义服务操作。 所以这样的操作:

[OperationContract]
string DoWork(int value);

…可能会在服务合同中表示为:

[OperationContract(AsyncPattern = true)]
IAsyncResult BeginDoWork(int value, AsyncCallback callback, object state);

string EndDoWork(IAsyncResult result);

请注意,这两种形式是等效的,并且在WCF元数据中是无法区分的:它们都公开了一个称为DoWork [1]的操作:

===============>>#1 票数:1

异步部分需要在客户端中完成。 这意味着您可能正在执行类似的操作:var response = ServiceReference.GetSomething();

相反,请创建一个代理以获取回调。 每当回调收到响应时,都会触发(或调用)创建和事件(或委托)。 在上面的语句中,您显然正在等待将响应分配给变量,然后再移至下一行。

相反,您可以

  1. 在服务合同上,请确保使用[OperationContract(IsOneWay = true)]装饰
  2. 如果使用ServiceReference或serviceutil,它将自动创建“传入事件”并为您完成所有客户端异步工作。
  3. 如果您使用的是TCP,则还要创建一个回调协定,然后在客户端上可以执行ServiceReference1.IncomingSomething + = new eventHandler之类的操作。 现在,您可以执行ServiceReferecnce1.GetSomething(),响应将转到eventhandler函数。
  4. 如果这是RESTFUL:

      public void MakeAsyncRequest(string url, string contentType) { try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.ContentType = contentType; request.Method = WebRequestMethods.Http.Get; request.Timeout = 10000; request.Proxy = null; request.BeginGetResponse(new AsyncCallback(ReadCallback), request); } catch (Exception ex) { LogManager.LogException(ex); } } private void ReadCallback(IAsyncResult asyncResult) { HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState; string strContent = string.Empty; string s; try { using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult)) { Stream responseStream = response.GetResponseStream(); using (StreamReader sr = new StreamReader(responseStream)) { //Need to return this response strContent = sr.ReadToEnd(); } } } catch (Exception ex) { throw; } } 

  ask by Philo translate from so

未解决问题?本站智能推荐:

1回复

ASP.NET MVC同步与异步WCF调用

我正在使用ASP.NET MVC,它通过WCF服务完全加载其数据。 我的模型所做的只是调用WCF服务。 然后,控制器将模型传递到视图。 我在看这个文章,它始终是更好地做异步调用,如果你能。 但是我仍然不确定使用哪个电话。 如果服务中的数据加载需要一段时间,该怎么办? 这是否意味着我的
1回复

与https回复端点的WCF双工连接

我有一个带有回调的双工Wcf连接,通过http可以正常工作(当我使用<compositeDuplex clientBaseAddress="http://localhost:8678/.."/> ),但是当我尝试将该地址切换为https( "https://localhost:867
1回复

WCF服务中的异步调用

我们遇到一种情况,需要在数据服务的InitializeService方法中执行一些长时间运行的代码。 当前,对数据服务的第一个调用会触发代码,但直到长时间运行的代码完成,才会收到响应。 不需要客户端等待此操作完成。 我试图使用一个新线程来执行代码,但是随着代码的运行,我们正在替换服务器上的
1回复

如何发送异步WCF呼叫? [重复]

可能重复: 如何异步调用我的WCF服务? 我是这样做的 但是,当我实际执行调用时,似乎将服务器占用大约一分钟(即使我知道异步过程需要更长时间并且仍在处理请求)。 即使我尝试在不同的浏览器中点击该页面,它仍然需要一分钟才能加载。 基本上我只是想进行WCF调用并忘记它
1回复

异步WCF服务阻止ASP应用程序

我有一个正在调用WCF服务的ASP(MVC2)应用程序。 该服务将花费很长时间,因此我不希望客户端ASP应用程序等待其完成。 它在数据库中记录其状态,并且该状态可用于ASP客户端。 我正在异步调用该服务,但是当我尝试转换到下一页时,我的ASP应用程序仍然挂起。 我怀疑是因为线程挂起,等
1回复

WCF异步方法调用返回响应对象

我目前正在开发WCF服务和使用它的客户端。 直到昨天,该服务运作良好。 我可以正常调用方法以及异步调用。 但是:然后我在接口和服务类中添加了一些新方法。 然后我使用svcutil.exe为客户端生成Service.cs和output.config。 现在异步方法不再返回它们的返回类型,
1回复

默认情况下,ASMX WebService或WCF或aspx页面是异步的吗?

我将自己投入到一个赌注中,我们的仇恨是关于-异步Web服务和我上面提到的其他内容。 我在逻辑上认为默认情况下Web服务是同步的,其他人说这是不正确的。 谁是对是谁?谁能向我解释? 提前致谢。
2回复

ASP.NET Web窗体-如何异步调用WCF异步方法?

我已经创建了WCF服务并将其托管在IIS中。 我可以通过在asp.net Web窗体应用程序中创建Web引用来访问WCF服务。 我需要让WCF Web服务运行长时间运行的方法(异步)。 有没有人有很好的示例代码说明如何从asp.net Web窗体应用程序按钮单击方法调用WCF异步方法?
2回复

通过WCF(C#)从ASP.NET反馈异步运行进程

(环境.NET 4.0 C#WCF和ASP.NET) 所以这是我想要发生的流程: 用户访问页面。 用户通过控件上传文件。 用户单击“提交”。 Page告诉WCF服务开始“处理”此文件(发生很多幕后工作,如解压缩,哈希,移动和数据库工作) 随着文件的
2回复

ASP.NET MVC 4 Web API:如何异步处理需要从异步WCF服务回调中提取结果的请求

假设我使用ASP.NET MVC 4实现了一个Web服务,该服务的控制器公开了一种方法: 该Web服务与中间层服务进行通信以处理请求。 中间层服务合同服务如下所示: 该服务通过匹配的Process / Processed方法异步处理请求。 从Web服务异步调用到此中间层服