Asp.net WCF同步与异步
我一直在看MSDN和codeproject,但我还是有点困惑 同步服务与异步服务 我有一个WCF服务端点。此服务将双向SSL应用于其web.config文件。 客户端端点是一个基于Oracle的java Weblogic套件。它有自己的私钥和公钥。客户机需要与我们的服务进行异步和同步通信 我只能在服务器端更改内容 以下代码是SVC、cs文件的同步部分:-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
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() 相反,创建一个代理来获取回调。创建一个事件(或委托),该事件在回调收到响应时被激发(或调用)。在上面的语句中,您显然在等待将响应分配到变量中,然后再移动到下一行 相反,你可以
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;
}
}