gpt4 book ai didi

asp.net - WCF 同步与异步

转载 作者:太空宇宙 更新时间:2023-11-03 14:17:35 25 4
gpt4 key购买 nike

我一直在看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();
}

我对回调 deli-gator、对象状态等有所了解,但有人可以为我进一步说明吗?如何格式化服务的异步部分?网络上有很多例子......但都非常困惑。我一定对这个概念有一些固有的误解。

编辑:- 我在回答中被告知,服务器端不需要对异步通信方式进行操作。但是我发现了这个:-

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

[OperationContract]
string DoWork(int value);

……在服务契约(Contract)中可能会表述为:

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

string EndDoWork(IAsyncResult result);

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

最佳答案

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

相反,创建一个代理来获取回调。创建和事件(或委托(delegate)),只要回调收到响应就会被触发(或调用)。在上面的语句中,您显然是在等待将响应分配给变量,然后再转到下一行。

相反,你可以

  1. 在Service contract上,一定要用[OperationContract(IsOneWay = true)]装饰
  2. 如果您使用 ServiceReference 或 serviceutil,它会自动创建“传入事件”并为您完成所有客户端异步工作。
  3. 如果您使用的是 TCP,请同时创建一个回调契约(Contract),然后在客户端上您可以执行类似ServiceReference1.IncomingSomething += 新事件处理程序。现在您可以执行 ServiceReferecnce1.GetSomething(),响应将转到事件处理函数。
  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;
    }
    }

关于asp.net - WCF 同步与异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16041473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com