2011-03-01 4 views
6

푸시 알림을 사용하는 Windows Phone 7 응용 프로그램을 작성 중이며, MS Notification Server와 내 서비스 간의 상호 작용을 관리하는 클래스가 있습니다. 구름. 그러나 장치에서 채널을 열려고 시도 할 때 HttpNotificationChannel이 "채널을 열지 못했습니다."라는 메시지와 함께 InvalidOperationException을 던지고 있습니다. MSDN에 따르면 채널을 다시 열어 봐야합니다.HttpNotificationChannel Open() throw InvalidOperationException ("채널 열기 실패")

푸시 알림을 열려면 내 스 니펫이 다음과 같은 표준 패턴을 따르고 있습니다.

public class HttpNotification { 
    private const string kChannelName = "MyApp.PushNotification"; 

    private HttpNotificationChannel _Channel; 

    public void Register() { 
    try { 
     _Channel = HttpNotificationChannel.Find(kChannelName); 
     if (_Channel == null) { 
     _Channel = new HttpNotificationChannel(kChannelName); 
     InstallEventHandlers(); 

     // This line throws 
     _Channel.Open(); 
     } else { 
     InstallEventHandlers(); 
     }; 
    } catch (InvalidOperationException ex) { 
     MessageBox.Show(string.Format("Failed to initialise Push Notifications - {0}", ex.Message)); 
    }; 
    } 
} 

"채널을 다시 열어보십시오."라는 MSDN의 의미는 정확히 모르겠습니다. 나는 시도/catch에서 Open()에 대한 호출을 감싸고 시도 사이에 5 초 동안 멈추지 만 성공하지는 않습니다. 나는 또한 전체 메소드 (즉, HttpNotificationChannel.Find()를 호출 할 때마다 호출)를 사용하여 동일한 접근법을 시도했다.

나는 이것이 약간 모호하다는 것을 알고있다 - 그러나 이것을 처리하는 것에 대한 제안이 있다면 궁금해하고 있 었는가? 이 동일한 코드는 에뮬레이터에서 완벽하게 작동하지만 응용 프로그램을 제거하고 다시 설치 한 후에도 실제 장치에서 매번 실패합니다. 이것이 내 실제 전화 인 것을 감안할 때 하드웨어 문제를 해결하기 위해 약간의 노력을 기울여야하며,이 문제로 인해 시장에 응용 프로그램을 공개하는 것이 쉽지 않을 것입니다.

업데이트 : 추가 포인트, 인증되지 않은 채널을 사용하고 있으므로 클라우드 기반 서비스에 인증서가 설치되어 있지 않습니다.

업데이트 # 2 : 더 나아가 Microsoft 전화 푸시 래서 피를 내 장치에 배치하려고 시도한 결과 동일한 예외가 발생했습니다. 이미 이러한 시도하지 않은

답변

0

@slaad .. 여기에 내가 확인 할 몇 가지가 있습니다 :

  1. 귀하의 실제 장치는 바로, 데이터 연결이 있습니까? doh :)
  2. 기존 채널을 Isolated Storage에 저장하는 방법은 무엇입니까? Find()가 예외로 이어지는 채널을 다시 만들려고하지 않고 &에서 작동하는지 확인하십시오.
  3. 채널 생성에 도메인 이름이나 인증서와 관련된 문제가 있는지 확인하십시오. Try this link
  4. 확인 이보다 this

죄송합니다, 아니되는 훨씬 더 도움에 대한 프로세스의 모든 단계.

+0

그래 찾고있는 것 - 나는 비행기 모드로 내 장치를 설정하고 내 무선 랜에 연결하려고했습니다 내 3G 데이터 제공 업체가 문제를 일으키지 않도록 보장해야합니다. – MrMDavidson

+0

명확히하기 위해 Find() 메소드는 WP7'HttpNotificationChannel' 클래스에서 제공되는 정적 메소드입니다. 채널의 스토리지를 명시 적으로 수행하지는 않습니다. 또한 앱을 다시 설치 한 후에도 계속 유지되므로 느린 채널이 있어서는 안됩니다. 또한 채널 닫기(), 앱 재시작 및 도움이되는지 확인했습니다. 주사위가 없다. 인증되지 않은 채널을 사용하고 있습니다 (예 : 인증서가 필요 없음). 그래서 3이 종료되었습니다. 에뮬레이터에서 생성 프로세스는 완벽하게 작동하므로 # 4에 대해 모호하지만 단계별로 다시 진행됩니다. – MrMDavidson

+0

이 문제가 해결 되었습니까? – curiosity

6

의견에 따르면 에뮬레이터에서는 작동하지만 휴대 전화에서는 정상적으로 작동하지 않는다고 생각합니까? 다른/이전 신청서에서 채널 이름을 사용하셨습니까?

문제는 에뮬레이터가 닫힐 때마다 기본 상태로 다시 설정된다는 것입니다. 휴대 전화는 닫히지 않습니다. 특정 채널 이름은 단일 응용 프로그램에서만 사용할 수 있습니다. 따라서 채널 이름이 동일한 휴대 전화의 다른 응용 프로그램에서 사용되기 전에 해당 응용 프로그램에 채널 이름이 등록되어 있고 응용 프로그램에서 해당 채널 이름에 액세스 할 수없는 경우

반대로 앱도 하나 이상의 채널을 등록 할 수 있으므로 이미 등록 된 다른 이름이 있으면 이전 등록을 등록 취소하고 기기를 다시 부팅 할 때까지 새로운 이름을 등록 할 수 없습니다..또한 앱과 연결된 채널을 요청할 방법이 없습니다. 나는이 루프에 갇혀있어 때

는 궁극적으로 나는 채널의 이름을 변경하고 내 응용 프로그램은 WMAppManifest.xml에 등록 된 제품 ID 및

<App xmlns="" ProductID="{d57ef66e-f46c-4b48-ac47-22b1e924184b}" 

업데이트 내 컴퓨터가이 추락은 다시 나에게 형성 일했다 주말, WHS와 백업에 대한 하나님 감사드립니다. 어쨌든 내 소스 코드입니다. 나는 두 가지 차이점을 느낀다.

  1. 우선 I 어느 I 대리자 같은 실행 코드 전체를 통과 RepeatAttemptExecuteMethod()라는 방법을 만들었다. 마지막에 어딘가에 떠있는 것은 재 시도해야하는 시간입니다. .Open 메서드를 5 초마다 다시 시도한 경우 차이점은 Find 및 New 메서드를 다시 호출한다는 것입니다.

  2. 또 다른 차이점은 _appChannel.ChannelUri이 null 일 수 있다고 가정합니다. . 어떤 경우에는 채널이 이벤트를 발생시킬 때까지 기다린 다음 실제 채널과 연계 된 작업을 수행합니다. 당신에 SampleCode 내가 의심 작업의 종류 중 하나를 수행하지 않기 때문에 그러나 그것은 당신이

    protected override void Load(PhoneApplicationPage parent) 
    { 
        Verkeer.Helper.ExternalResources.RepeatAttemptExecuteMethod(() => 
        { 
         _appChannel = HttpNotificationChannel.Find(CHANNELNAME); 
         if (_appChannel == null) 
         { 
          _appChannel = new HttpNotificationChannel(CHANNELNAME); 
          SetUpDelegates(); 
         } 
         else 
         { 
          SetUpDelegates(); 
          //if (_appChannel.ChannelUri != null) this.NotificationChannel = _appChannel.ChannelUri; 
         } 
         if (_appChannel.ChannelUri != null) this.NotificationChannel = _appChannel.ChannelUri; 
         else 
         { 
          try 
          { 
           _appChannel.Open(); 
          } 
          catch { } 
         } 
    
         BindToShellTile(); 
    
         App.ViewModel.TrafficInfo.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(TrafficInfo_PropertyChanged); 
    
         if (App.ViewModel.TrafficInfo.TrafficImage != null && this.NotificationChannel != null) 
         { 
          CreateTiles(); 
         } 
        },10); 
    } 
    
    private void BindToShellTile() 
    { 
        if (!_appChannel.IsShellTileBound && App.ViewModel.PanItemSettings.AutomaticallyUpdateTile) 
        { 
         Collection<Uri> ListOfAllowedDomains = new Collection<Uri> { new Uri("http://m.anwb.nl/") }; 
         _appChannel.BindToShellTile(ListOfAllowedDomains); 
        } 
    } 
    
    
    void TrafficInfo_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
    { 
        if (e.PropertyName == "TrafficImage") 
        { 
         if (App.ViewModel.PanItemSettings.AutomaticallyUpdateTile && this.NotificationChannel != null) 
         { 
          CreateTiles(); 
         } 
        } 
    } 
    
+0

@Leon : 맞습니다. 에뮬레이터에서 제대로 작동합니다. 기존 버전의 앱을 제거하고 재부팅하고 ProductID 및 채널 이름을 변경 한 다음 앱을 다시 배포했지만 여전히 동일한 문제가 발생했습니다. 이 문제에 직면했을 때 null을 반환하는 HttpNotificationChannel.Find()가 있었습니까? 나 때문이야. – MrMDavidson

+0

예. 실제 채널은 더 이상 존재하지 않았지만 등록을 가리키는 것이기 때문에 나는 추측합니다. 내가 제거 할 수있는 유일한 방법은 앱을 제거하고, 전화를 다시 부팅하고, 앱 ID를 변경하고, 강제로 다시 빌드 한 다음 강제로 재배포하는 것입니다. –

+0

Btw는 Microsoft 전화 푸시가 아닙니다. 보내기 레시피 보내기 알림 레시피 및 수신하지 않음 ? –