แอพ Metro ใน Windows 8 จะสื่อสารกับแอพเดสก์ท็อปแบ็กเอนด์บนเครื่องเดียวกันได้อย่างไร


120

ในสถานการณ์ที่คุณมีส่วนหน้า UI ที่สร้างขึ้นโดยใช้แอพสไตล์เมโทรใหม่สำหรับ windows 8 และต้องการให้มันสื่อสารกับแอปพลิเคชัน. NET ที่ทำงานบนเดสก์ท็อปบนเครื่องท้องถิ่นเดียวกัน (เช่นแอปบริการ windows)

การสื่อสารระหว่างกระบวนการมีรูปแบบใดบ้างระหว่างแอป Metro และแอปเดสก์ท็อป

ขอขอบคุณ Pavel Minaev จากทีม Visual Studio ที่ให้ข้อมูลเบื้องต้นบางส่วนที่นี่ในความคิดเห็นโดยอ้างถึง:

จากข้อมูลของ Martyn Lovell ไม่มีกลไกใด ๆ สำหรับสิ่งนั้นและบางส่วนที่สามารถใช้งานได้นั้นถูก จำกัด โดยเจตนา ท่อที่มีชื่อจะไม่มีเช่นและไม่มีไฟล์ที่แมปหน่วยความจำ มีซ็อกเก็ต (รวมถึงซ็อกเก็ตเซิร์ฟเวอร์) แต่เมื่อเชื่อมต่อกับ localhost คุณสามารถเชื่อมต่อกับแอพเดียวกันเท่านั้น คุณสามารถใช้ไฟล์ปกติในหนึ่งใน "โฟลเดอร์ที่รู้จัก" ที่แชร์ (เอกสารรูปภาพ ฯลฯ ) แต่นั่นเป็นการแฮ็กที่ค่อนข้างหยาบซึ่งจำเป็นต้องมีการสำรวจและผู้ใช้สามารถมองเห็นได้ - Pavel Minaevแสดงความคิดเห็นเกี่ยวกับปัญหานี้

ดังนั้นการล้มเหลวในแนวทางปกติฉันกำลังคิดที่จะใช้บริการเว็บหรือการอ่าน / เขียนไปยังฐานข้อมูลเพื่อให้รูปแบบการสื่อสารบางอย่างเกิดขึ้นซึ่งทั้งสองอย่างนี้ดูเหมือนจะมากเกินไปเมื่อกระบวนการทำงานบนเครื่องเดียวกัน

สิ่งที่ฉันพยายามทำอยู่ตรงนี้สมเหตุสมผลไหม ฉันเห็นว่าจำเป็นต้องมีแอปรถไฟฟ้าใต้ดินเพื่อเป็น UI ส่วนหน้าสำหรับบริการที่มีอยู่ซึ่งทำงานบนเดสก์ท็อป หรือจะดีกว่าถ้าใช้ WPF สำหรับส่วนหน้า UI ที่ทำงานบนเดสก์ท็อป (เช่นแอปที่ไม่ใช่เมโทร)


2
แล้วบริการ WCF ในพื้นที่ล่ะ?
Gleno

2
@Gleno ที่จะกล่าวถึง "การคิดจะใช้บริการเว็บ" ในคำถาม ที่กล่าวว่าฉันสงสัยว่ามันจะใช้งานได้หรือไม่ - หากการใช้งานไลบรารีไคลเอนต์ WCF ที่มีให้ใน. NET Core นั้นสร้างขึ้นที่ด้านบนของซ็อกเก็ต WinRT จากนั้นสันนิษฐานว่าจะใช้ข้อ จำกัด "no localhost" เดียวกัน สิ่งนี้ต้องได้รับการตรวจสอบ
Pavel Minaev

1
ดูเหมือนว่า NetNamedPipeBinding และ NetTcpBinding ของ WCF (ผ่าน localhost) จะไม่สามารถใช้งานได้เนื่องจากข้อ จำกัด ในเมโทร ที่จะออกจากบริการเว็บหรือการผูก MSMQ? ฉันไม่แน่ใจว่า WCF มีให้บริการในรถไฟใต้ดินจริงหรือไม่
dodgy_coder

6
ให้ฉันตอบคำถามของคุณและถามคุณ: จะเกิดอะไรขึ้นถ้าไม่มีบริการเดสก์ท็อปที่คุณใช้สื่อสารอยู่ โปรดจำไว้ว่าแอปพลิเคชันของคุณสามารถติดตั้งได้จากร้านค้าเท่านั้นดังนั้นจึงไม่สามารถพึ่งพาบริการเดสก์ท็อปได้
คืนสถานะ Monica Larry Osterman

3
ดูเหมือนว่าองค์กรต่างๆสามารถโหลดแอปแบบกำหนดเองและข้าม Windows Store ได้ หากเป็นเช่นนั้นคุณสามารถสมมติว่าแอปพลิเคชันบางตัวทำงานในสภาพแวดล้อมขององค์กร ที่กล่าวว่าฉันคิดว่าโปสเตอร์ต้นฉบับควรใช้ส่วนหน้า WPF สำหรับเดสก์ท็อปเพื่อจุดประสงค์ของเขา
Ankur Goel

คำตอบ:


54

ฉันกำลังย้ายโครงการที่มีอยู่ไปยัง Win8 ในขณะนี้ ประกอบด้วยบริการ windows และแอพพลิเคชั่นถาดซึ่งกำลังคุยกันผ่าน NamedPipes WCF อย่างที่คุณทราบอยู่แล้วว่า Metro ไม่รองรับท่อที่มีชื่อ ฉันลงเอยด้วยการใช้ TcpBinding สำหรับการเชื่อมต่อแบบ full duplex

โพสต์นี้อธิบายถึงฟังก์ชันที่รองรับ

ตัวอย่างของเซิร์ฟเวอร์ของฉัน WCF ว่าลูกค้าเมโทรสามารถใช้เป็นที่นี่

โปรดทราบว่าคุณไม่สามารถใช้ซิงโครนัส WCF ในเมโทรได้ คุณจะต้องใช้กระดาษห่อตามงานซึ่งเป็นแบบอะซิงโครนัสเท่านั้น

และขอบคุณสำหรับคำถาม ฉันเป็นจุดเริ่มต้นที่ดีสำหรับฉัน :)


7
ขอบคุณสำหรับสิ่งนี้ ... นั่นเป็นความช่วยเหลือที่ดี เป็นการดีที่จะเห็นคำตอบที่ใช้ได้จริงแทนที่จะบอกว่าไม่ควร / ทำไม่ได้
dodgy_coder

1
อาจเป็นคำถามโง่ ๆ ... แต่คุณสามารถเชื่อมต่อกับ localhost โดยใช้ตัวอย่างของคุณได้หรือไม่? คำถามที่คุณเชื่อมโยงเพื่อแสดงภายในของ Visual Studio (ฉันอนุมานจากเส้นทาง แต่ถ้าฉันผิดโปรดแก้ไขด้วย) WCF (รวมกับ localhost) ทำงานนอก WCF หรือไม่
dzendras

1
@dzendras แน่นอนว่าจะได้ผล มันจะทำงานร่วมกับ localhost เช่นกัน
ผู้เชี่ยวชาญ

3
ฉันสงสัยว่าแอปแบบนี้จะผ่านการรับรองจาก Store
Ani

6
หากสิ่งนี้เป็นกฎที่ฉันคิดว่าอาจถูกยกมา"3.9 ตรรกะของแอปทั้งหมดต้องมาจากและอยู่ในแพ็กเกจแอปของคุณแอปของคุณจะต้องไม่พยายามเปลี่ยนแปลงหรือขยายเนื้อหาแพ็กเกจผ่านรูปแบบใด ๆ ของการรวมโค้ดแบบไดนามิกหรือ ข้อมูลที่เปลี่ยนแปลงวิธีการที่แอปพลิเคชันโต้ตอบกับ Windows Runtime หรือการทำงานที่เกี่ยวข้องกับนโยบาย Store ตัวอย่างเช่นไม่อนุญาตให้ดาวน์โหลดสคริปต์ระยะไกลและเรียกใช้สคริปต์นั้นในบริบทภายในของแพ็กเกจแอปของคุณ "
Ani

38

มีคำถามมากมายเช่นนี้ในตอนท้ายของ // build / session ที่ฉันเข้าร่วม AlešHolečekผู้บริหารที่ทำหนึ่งในเซสชันภาพใหญ่ออกมาจากผู้ชมเพื่อจัดการพวกเขา แม้ว่าคุณจะไม่ใช่นักพัฒนา C ++ ให้ดาวน์โหลดเซสชันนั้นและดูคำถามและคำตอบhttp://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-789C

แอพ Metro ไม่สามารถนับบนแอพเดสก์ท็อปหรือบริการที่ติดตั้งบนเครื่องได้ และแอปบนเดสก์ท็อปไม่สามารถนับบนแอป Metro ที่ทำงานได้เนื่องจากสามารถระงับได้ตลอดเวลา คุณต้องเริ่มคิดต่าง ฟังAlešเกี่ยวกับเรื่องนี้


6
คำถามที่แน่นอนนี้ดูเหมือนจะถูกถามเมื่อเวลา 47:20 น. ในวิดีโอ
Pavel Minaev

3
... และอีกหนึ่งตอนเวลา 55:00 น. โดยทั่วไปแล้วคำตอบดูเหมือนจะเป็น "คุณไม่สามารถทำเช่นนั้นได้"
Pavel Minaev

1
@dodgy_coder ฉันไม่แน่ใจว่า WCF / TCP (หรือ HTTP) จะทำงานบนเครื่องเดียวกัน หากแซนด์บ็อกซ์ไม่อนุญาตให้คุณเชื่อมต่อlocalhostโดยตรงผ่านซ็อกเก็ต TCP ทำไมจึงปล่อยให้คุณทำเช่นเดียวกันผ่าน WCF
Pavel Minaev

2
ที่น่าสนใจคือมีการรองรับการสื่อสารระหว่างสองแอพเมโทรผ่านสัญญาแชร์แต่ดูเหมือนว่าจะคล้ายกันในการใช้งานกับคลิปบอร์ดและสำหรับการถ่ายโอนทางเดียวจากแอพต้นทางไปยังแอพเป้าหมายแทนที่จะใช้สำหรับการใช้งานพูดสอง - โปรโตคอลการสื่อสารทาง
dodgy_coder

4
สำหรับฉันแล้วดูเหมือนว่าแอพ LOB Metro ที่โหลดด้านข้างจะไม่มีปัญหาขึ้นอยู่กับแอพเดสก์ท็อปหรือบริการที่ติดตั้ง ฉันมีช่วงเวลาที่ยากลำบากที่เชื่อว่าสถานการณ์จริงนี้จะไม่ได้รับการสนับสนุน ด้วย Silverlight เราเห็นความสามารถในการทำงานร่วมกันของเดสก์ท็อป / เนทีฟเพิ่มขึ้นทีละน้อย ... ฉันค่อนข้างแน่ใจว่ามีบางอย่างในสถานการณ์เหล่านี้ (ชื่อไปป์หรือไฟล์ที่แมปหน่วยความจำหรือบางอย่าง ... ) (พร้อมเอกสารคำแนะนำ) ในอนาคต.
David Cuccia

11

โปรดทราบว่าด้วยการอัปเดต Windows 8.1 การสื่อสารระหว่างแอป Windows Store และส่วนประกอบเดสก์ท็อปที่เขียนด้วย C # สำหรับ. NET 4.5+ ได้รับการสนับสนุนอย่างเป็นทางการสำหรับแอปพลิเคชันที่โหลดด้านข้างในสถานการณ์ระดับองค์กร:

คอมโพเนนต์รันไทม์ของ Windows ที่พังทลายสำหรับแอพ Windows Store ที่โหลดด้านข้าง

อ้างถึง:

โดยตระหนักว่าฟังก์ชันและกฎทางธุรกิจที่สำคัญนั้นรวมอยู่ในสินทรัพย์ซอฟต์แวร์ที่มีอยู่และองค์กรต่างๆมีสถานการณ์ที่หลากหลายซึ่งรูปแบบแอปพลิเคชันใหม่จะมีประสิทธิผลสูง Windows 8.1 Update มีคุณลักษณะใหม่ที่เรียกว่า Brokered Windows Runtime Components สำหรับโหลดด้านข้าง การใช้งาน เราใช้คำว่า IPC (การสื่อสารระหว่างกระบวนการ) เพื่ออธิบายความสามารถในการเรียกใช้สินทรัพย์ซอฟต์แวร์เดสก์ท็อปที่มีอยู่ในกระบวนการเดียว (คอมโพเนนต์เดสก์ท็อป) ในขณะที่โต้ตอบกับรหัสนี้ในแอป Windows Store นี่เป็นรูปแบบที่นักพัฒนาระดับองค์กรคุ้นเคยเนื่องจากแอปพลิเคชันฐานข้อมูลและแอปพลิเคชันที่ใช้ NT Services ใน Windows มีสถาปัตยกรรมแบบหลายกระบวนการที่คล้ายคลึงกัน

แม้ว่าการใช้แนวทางนี้จะค่อนข้างซับซ้อนในตอนแรก แต่ก็ช่วยให้สามารถผสานรวมใน Windows Store และคอมโพเนนต์เดสก์ท็อปได้อย่างลึกซึ้ง โปรดทราบว่าในขณะนี้จะไม่ผ่านการรับรอง Windows Store สาธารณะ


5

มีความเป็นบทความในInfoQเกี่ยวกับวิธีการสร้างแอพพลิเคเมโทรคู่หลวมกับจัดการโปรโตคอล นี่คือสิ่งที่ Windows ได้รับการสนับสนุนมาเป็นเวลานานและใคร ๆ ก็สามารถมองเห็นแอปพลิเคชันเดสก์ท็อปที่ลงทะเบียนตัวเองเป็นตัวจัดการโปรโตคอลและแอปพลิเคชันรถไฟใต้ดินอาจสื่อสารผ่านกลไกนี้

ฉันไม่รู้ว่ามันเป็นไปได้หรือไม่ แต่มันก็น่าสนใจที่จะลองดู


บทความกล่าวว่า: "วิธีที่คุณสามารถทำได้ใน Metro [ข้ามไปที่เวิร์กโฟลว์อื่นในแอปพลิเคชันอื่น - เนื่องจากแอปของคุณมีขนาดเล็กและเน้นมาก] โดยใช้ประโยชน์จากโปรโตคอลสำหรับตัวอย่างของเราด้านบนโปรโตคอลอาจมีลักษณะดังนี้ “สุดยอดสต็อกซื้อ: // ลูกค้า = 123 & หุ้น = XYZ” ". - ในทางเทคนิคแล้ว "การใช้ประโยชน์จากโปรโตคอล" หมายความว่าอย่างไร
Lumi

ปัญหาของแนวทางนี้คือเป็นการสื่อสารทางเดียวเท่านั้น
ผู้เชี่ยวชาญ

3

Christophe Nasarre ได้บล็อกเกี่ยวกับวิธีที่ค่อนข้างแฮ็กโดยใช้ไฟล์ในเครื่อง ผลลัพธ์คือการสื่อสารระหว่างแอพเดสก์ท็อป / แอพ Windows store (เรียกว่า DA / WSA ในบล็อก) โดยไม่ต้องสลับระหว่าง UI ของสองแอพ นอกจากนี้เขายังเขียนบล็อกเกี่ยวกับเทคนิคแฮ็กอื่น ๆ ที่เกี่ยวข้องกับตัวจัดการโปรโตคอล

โปรดทราบว่าการมี WSA ที่สื่อสารกับ DA นั้นถูกห้ามอย่างชัดเจนโดยข้อกำหนดการรับรองแอปของร้านค้า

แอป Windows Store จะต้องไม่สื่อสารกับแอปพลิเคชันหรือบริการบนเดสก์ท็อปในพื้นที่ผ่านกลไกภายในเครื่องรวมถึงผ่านไฟล์และคีย์รีจิสทรี

... แต่ จำกัด เฉพาะ "กลไกในพื้นที่" เท่านั้น ดังนั้นฉันเดาว่าเราสามารถสร้างบริการเว็บสำหรับกำหนดเส้นทางการสื่อสารได้


3

หากคุณคิดว่าคุณสามารถดำเนินการ cmd ด้วยตนเองเพิ่มเติมได้คุณสามารถลอง:

X:/> CheckNetIsolation.exe LoopbackExempt a n=<packageID>;

CheckNetIsolation.exe รวมอยู่ในการติดตั้ง winRT ดังนั้นจึงไม่มีอะไรเพิ่มเติมให้ต้องติดตั้ง

ฉันลองแล้วมันใช้งานได้แม้หลังจากอัปเดตแพ็คเกจแล้ว

ดังแสดงบน: http://msdn.microsoft.com/en-us/library/windows/apps/Hh780593.aspx

นี่คือคำอธิบายวิธีค้นหา packageID สำหรับแอปของคุณ: http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/82bad7d4-d52b-4731-a396-13ab9004c1cc/how-to-get- ที่ appid ของ -a รถไฟใต้ดินสไตล์แอป


ฉันต้องการที่จะสื่อสารกับ localhost สำหรับแอปพลิเคชันภายในและฉันสามารถทำให้มันเกิดขึ้นได้เฉพาะบนคอมพิวเตอร์ที่ไม่ได้ใช้ VS โดยใช้คำสั่งนี้
adosaiguas

2

เป็นไปได้ที่จะสื่อสารบนเครื่องเดียวกันจากแอพ Metro ไปยังแอพเดสก์ท็อปโดยใช้บริการในพื้นที่ ฉันเคยใช้ "การพิสูจน์แนวคิด" แบบง่ายๆมาแล้ววิธีการข้ามแซนด์บ็อกซ์ WinRT โดยใช้บริการในพื้นที่ ยังคงต้องการ "วิศวกรรมสังคม" หรือคำแนะนำโดยตรงสำหรับการติดตั้งบริการ แต่อย่างไรก็ตามมันเป็นไปได้
ฉันไม่แน่ใจเกี่ยวกับกฎการรับรองเกี่ยวกับการสื่อสาร "บริการในพื้นที่" เมื่อเพิ่มแอปดังกล่าวลงใน Windows Store

ตัวอย่างที่นี่

ด้วยการออกแบบแอปพลิเคชัน Metro ไม่สามารถเข้าถึงพีซีพื้นฐานได้โดยตรงโดยใช้ WinRT API และความสามารถที่มีเท่านั้น แต่เมื่อคุณสร้างบริการแบ็คเอนด์เพื่อเข้าถึงพีซีและข้อมูลทั้งหมดที่นั่นโดยทั่วไปจะไม่ทำงานในแซนด์บ็อกซ์อีกต่อไป

"ปัญหา" เพียงอย่างเดียวคือผู้ใช้ต้องติดตั้งบริการแบ็คเอนด์นี้ด้วยตนเอง แต่จะไม่มีปัญหาในการใช้ "วิศวกรรมสังคม": ผู้ใช้ดาวน์โหลดแอปเมโทร "เบราว์เซอร์พีซี" ผู้ใช้สามารถเรียกดูรูปภาพเพลงและวิดีโอทั้งหมดได้ โดยใช้ WinRT API แต่แอปยังแสดงข้อความที่ด้านล่าง: "ดาวน์โหลด powerpack เบราว์เซอร์พีซีของเราและเรียกดูพีซีของคุณทั้งเครื่องฟรี"

ผู้ใช้จะถูกเปลี่ยนเส้นทางไปยังหน้าเว็บซึ่งผู้ใช้สามารถดาวน์โหลดโปรแกรมติดตั้งเดสก์ท็อปแบบคลาสสิกที่มีบริการแบ็คเอนด์ "เบราว์เซอร์พีซี" สำหรับการเข้าถึงไฟล์บนพีซีของผู้ใช้ทั้งเครื่อง เมื่อติดตั้งบริการเดสก์ท็อปนี้แล้วแอพ Metro จะตรวจจับและใช้เพื่อเรียกดูพีซีทั้งเครื่อง ผู้ใช้มีความสุข แต่แซนด์บ็อกซ์ WinRT ถูกบุกรุก

แน่นอนว่าจะใช้ไม่ได้กับแท็บเล็ต Windows 8 ARM การใช้วิธีแก้ปัญหานี้อาจเป็นไปได้ที่จะสร้างไคลเอนต์แอป Metro สำหรับแอปเดสก์ท็อปแบบคลาสสิกเช่นโปรแกรมป้องกันไวรัสไคลเอนต์ torrent / P2P เป็นต้น


3
ไม่แน่ใจว่าทำไมคุณต้องพูดถึงวิศวกรรมสังคม ... เนื่องจากคำถามเดิมกำลังพูดถึงแอพ / บริการบนเดสก์ท็อปที่พูดกับแอพเมโทรคาดว่าผู้ใช้จะต้องติดตั้งแอพเดสก์ท็อป / บริการแยกกัน แล้วคุณใช้วิธีการสื่อสารแบบใดระหว่างบริการเดสก์ท็อปกับแอพเมโทร?
dodgy_coder

0

บางทีฉันอาจพลาดประเด็นนี้ไป แต่เมื่อเปิดใช้งานความสามารถของเครือข่ายส่วนตัวฉันสามารถเชื่อมต่อกับเซิร์ฟเวอร์ที่ใช้งานภายใน (http) โดยใช้ที่อยู่ IP ในเครื่อง (ไม่ใช่ localhost) สิ่งนี้เปิดใช้สถานการณ์ของฉันที่แอป winrt สื่อสารกับแอปเดสก์ท็อป wpf

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.