Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net WCF同步与异步_Asp.net_Wcf_Ssl_Asynchronous - Fatal编程技术网

Asp.net WCF同步与异步

Asp.net WCF同步与异步,asp.net,wcf,ssl,asynchronous,Asp.net,Wcf,Ssl,Asynchronous,我一直在看MSDN和codeproject,但我还是有点困惑 同步服务与异步服务 我有一个WCF服务端点。此服务将双向SSL应用于其web.config文件。 客户端端点是一个基于Oracle的java Weblogic套件。它有自己的私钥和公钥。客户机需要与我们的服务进行异步和同步通信 我只能在服务器端更改内容 以下代码是SVC、cs文件的同步部分:- public getQuoteSyncResponse1 getQuoteSync(getQuoteSyncRequest request

我一直在看MSDN和codeproject,但我还是有点困惑

同步服务与异步服务

我有一个WCF服务端点。此服务将双向SSL应用于其web.config文件。 客户端端点是一个基于Oracle的java Weblogic套件。它有自己的私钥和公钥。客户机需要与我们的服务进行异步和同步通信

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

以下代码是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;}
我有点了解回调deli-gator、对象状态等等,但是有人能为我进一步说明一下吗?如何格式化服务的异步部分?网络上有很多例子。。。但这一切都很令人困惑。我对这个概念肯定有一些固有的误解

Edit:-回答中告诉我,服务器端不需要对异步通信方式进行操作。但是我发现了这一点:-

在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]的操作:

异步部分需要在客户端中完成。这意味着您可能正在做类似的事情: var response=servicerence.GetSomething()

相反,创建一个代理来获取回调。创建一个事件(或委托),该事件在回调收到响应时被激发(或调用)。在上面的语句中,您显然在等待将响应分配到变量中,然后再移动到下一行

相反,你可以

  • 在服务合同上,请务必使用[OperationContract(IsOneWay=true)]进行装饰
  • 如果您使用ServiceReference或serviceutil,它将自动创建“传入事件”,并为您执行所有客户端异步工作
  • 若您使用的是TCP,那个么也可以创建一个回调协定,然后在客户机上执行如下操作 ServiceReference1.IncomingSomething+=新事件处理程序。 现在您可以执行ServiceReference1.GetSomething(),响应将转到eventhandler函数
  • 如果这是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;
                    }
                }
    

  • 只需再添加一些注释:->>是的,这是一个RESTful服务。>>是的,这是面向TCP的通信。>>我不能在客户端添加任何内容,客户端不由我处理。我唯一能与客户机协调的是双向SSL通信、RESTful Soap XML包和包的数据结构。那么您添加的代码是在客户端还是服务器端?您对代码的理解是正确的,这意味着它是在客户端完成的。服务中不能有异步/同步逻辑。它必须在客户端完成;您在服务端做什么并不重要,因为客户端将在移动到下一行之前等待响应。使用服务sync或async.hmmm…取决于客户端设计模式。。。。客户机是由其他人创建的。我在编码的这一部分没有任何作用。我从服务器端发布了我的代码。有什么需要在服务器端实现以使其与客户端异步兼容的吗?没有。在这种情况下,你无能为力。服务端没有关心同步/异步的设计模式。这一切都发生在客户身上。既然你没有在客户中扮演任何角色,你就没什么可做的了。
      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;
                    }
                }