5

Vì vậy, tôi đã tạo WCF khách hàng/máy chủ. Những gì tôi muốn là khi tôi gửi tin nhắn đến máy chủ từ máy khách này và cắt kết nối vì bất kỳ lý do nào, khách hàng tắt ví dụ, làm thế nào khách hàng này có thể nhận được phản hồi khi nó sẵn sàng một lần nữa?Cách nhận phản hồi từ máy chủ trong tin nhắn đáng tin cậy WCF sau khi cắt kết nối

Có thể đặt phiên hoặc thứ gì đó giữa máy khách và máy chủ không?

mã khách hàng của tôi là:

private static void Main(string[] args) 
{ 
    var client = new FlipCaseServiceClient("ReliableMessageService"); 
    var sd = new StringData { FirstName = "Turgut", LastName = "Kançeltik" }; 

    var fullName = client.GetFullName(ref sd); 

    Console.WriteLine(fullName); 
} 

mã máy chủ của tôi là:

[DeliveryRequirements(RequireOrderedDelivery = true)] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)] 
public class FlipCaseService : IFlipCaseService 
{ 
    public string GetFullName(ref StringData stringData) 
    { 
     var fullName = $"{stringData.FirstName} {stringData.LastName}"; 

     stringData.FullName = fullName; 
     return fullName; 
    } 
} 

Và máy chủ cấu hình trong tóm tắt:

<service behaviorConfiguration="ServiceBehaviorMetaData" name="FlipCaseService.FlipCaseService" > 
    <endpoint name="ReliableMessageService" address="flipcase/wsAddress" binding="wsHttpBinding" bindingConfiguration="BindingReliableMessaging" contract="FlipCaseService.IFlipCaseService" > 
    <identity> 
     <dns value="localhost" /> 
    </identity> 
    </endpoint> 
</service> 

<bindings> 
    <wsHttpBinding> 
    <binding name="BindingReliableMessaging"> 
     <reliableSession enabled="true" inactivityTimeout="00:10:00"/> 
    </binding> 
    </wsHttpBinding>  
</bindings> 

<behavior name="ServiceBehaviorMetaData"> 
    <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8080/flipcase/metadata" /> 
    <serviceDebug includeExceptionDetailInFaults="true" /> 
</behavior> 
+0

Bạn không thể thử gọi lại không thành công? – Evk

+0

Tôi không muốn tiến hành điều tương tự nữa trên Máy chủ. –

+0

Dịch vụ WCF là không trạng thái theo mặc định và đây là bản chất của dịch vụ, nhưng bạn có thể sử dụng trạng thái. Dù sao, trong kịch bản của bạn, tôi nghĩ rằng bạn có thể giải quyết bộ nhớ đệm kết quả cho cuộc gọi tiếp theo, tránh xử lý lại. –

Trả lời

2

Một cách tiếp cận hợp lý ở đây là sử dụng yêu cầu không đồng bộ -phản ứng. Điều đó có nghĩa là khách hàng không đợi máy chủ hoàn thành công việc của nó, chỉ cần kích hoạt yêu cầu và quên. Khi máy chủ được thực hiện, anh ta gọi lại máy khách với kết quả hoạt động. Cụ thể WCF có hợp đồng song công để đạt được điều đó: http://www.codeproject.com/Articles/491844/A-Beginners-Guide-to-Duplex-WCF.

Khi phản hồi của máy chủ sẵn sàng, nó sẽ cố gắng phân phối nó cho khách hàng. Nếu điều đó không thành công, máy chủ có thể thử lại sau, cho đến khi thành công hoặc một số thời gian chờ đạt được.

Nếu bạn làm theo mẫu này, khách hàng phải có một số định danh duy nhất, để ngay cả khi kết nối được khôi phục - máy chủ biết đó là cùng một ứng dụng khách và nó biết câu trả lời nào đang chờ khách hàng này.

Một cách tiếp cận khác là lưu vào bộ nhớ cache kết quả trên máy chủ trong một khoảng thời gian (giới hạn). Bạn có thể cung cấp id duy nhất cho mỗi yêu cầu, sau đó kiểm tra trên máy chủ nếu yêu cầu với id như vậy đã được hoàn thành và nếu có - phân phối kết quả ngay lập tức. Nếu không, xử lý phản hồi và lưu trữ bộ nhớ cache trong thời gian giới hạn, trong trường hợp máy khách sẽ thử lại sau. Trên máy khách - chỉ cần thử lại về lỗi.

Các vấn đề liên quan