Tag : LINQ, namespace, Silverlight, xml, 실버라이트
개요
Silverlight 2 Beta 2에서 Socket을 사용할 때 Cross-Domain에 있는 소켓 서버에
접속을 하려면 서버 측의 정책을 확인하는 과정이 필요하게 된 것 아시죠?
다시말해, 실버라이트 런타임이 943번 포트를 통해 실버라이트 정책 파일을 요청하면,
서버 쪽에서는 정책파일을 보내줘야 하는데요.
며칠 전 공도씨가 [MSDN] 네트워크 보안 접근 제약란 제목의 장문의 번역글을 포스팅했습니다.
그 내용의 하단에 보시면 그런 역할을 하는 서버를 만드는 방법이 소개되어 있습니다.
[소켓을 위한 정책 파일 예제]와 [소켓을 위한 정책 서버의 샘플 코드]란 내용이 있구요.
Mike Snows의 Tip of the Day #12 - Full Implementation of a Silverlight Policy Server.를
참고하면 정책 파일 서버를 만들 수 있다고 설명해 놓았습니다.
다운로드
아래는 그것을 그대로 따라서 만들어 놓은 프로젝트구요.
제가 조금 코드를 바꿔서 정책 파일 요청시 Socket Client의 IP를 화면에서 알 수 있도록
하였습니다.
PolicyConnection.cs
public PolicyConnection(Socket client, byte[] policy)
{
_connection = client;
_policy = policy;
_buffer = new byte[_policyRequestString.Length];
_received = 0;
try
{
// receive the request from the client
//_connection.BeginReceive(_buffer, 0, _policyRequestString.Length, SocketFlags.None,
// new AsyncCallback(OnReceive), null);
_connection.BeginReceive(_buffer, 0, _policyRequestString.Length, SocketFlags.None,
new AsyncCallback(OnReceive), client.RemoteEndPoint.ToString());
}
catch (SocketException)
{
_connection.Close();
}
}
...
private void OnReceive(IAsyncResult res)
{
try
{
_received += _connection.EndReceive(res);
// if we haven't gotten enough for a full request yet, receive again
if (_received < _policyRequestString.Length)
{
_connection.BeginReceive(_buffer, _received, _policyRequestString.Length - _received,
SocketFlags.None, new AsyncCallback(OnReceive), null);
return;
}
// make sure the request is valid
string request = System.Text.Encoding.UTF8.GetString(_buffer, 0, _received);
if (StringComparer.InvariantCultureIgnoreCase.Compare(request, _policyRequestString) != 0)
{
_connection.Close();
return;
}
// send the policy
Console.Write(string.Format("Sending policy to {0}\n", res.AsyncState));
_connection.BeginSend(_policy, 0, _policy.Length, SocketFlags.None,
new AsyncCallback(OnSend), null);
}
catch (SocketException)
{
_connection.Close();
}
}
미리보기
static void Main(string[] args)
{
Console.Write("Starting...\n");
PolicyServer ps =
new PolicyServer(@"D:\clientaccesspolicy.xml");
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
}
감사합니다.
보너스
Beta1 시절 포스팅 되었던 스캇구 형님의 소켓 예제를 오늘 다시 한 번 찾아보니!
Beta2 버전으로 포팅이 되었습니다. 여기에도 Policy Server를 포함하고 있습니다.
한 번 훑어 보시면 도움이 되실 거라고 생각합니다.
Pushing Data to a Silverlight Client with Sockets: Part I
Pushing Data to a Silverlight Client with Sockets: Part II
Part I에서는 Socket Server를 Part II에서는 Socket Client를 설명하고 있습니다.
Tag : 943포트, clientaccesspolicy.xml, Silverlight, socket, 소켓, 실버라이트, 정책파일
Silverlight WebService Team 블로그에 제가 관심있어 하는 부분에 대한 포스트가 올라와서 번역을 해보았습니다.
원문 : http://blogs.msdn.com/silverlightws/
Scott이나 Tim의 포스트에서 아마도 읽은 바와 같이, 실버라이트 2 Beta 2는 새롭고 향상된 Web Service 기능들을 제공한다. 이 포스트는 우리 Beta 2 시나리오들을 좀더 상세하고 다룰 것이며, 두 주 가량 이어서 진행하면서, 특정한 기능들을 파 보도록 하겠다.
Duplex Communication (Server Push)
이것은 Beta 1 릴리즈 이후, 고객들이 최고로 많이 요청한 기능으로 채팅과 모니터링 프로그램 같은 몇몇 유용한 시나리오를 가능하게 만든다. Duplex는 클라이언트로 하여금 서버가 클라이언트에게 정보를 보내기(push) 위해서 호출할 수 있는 오퍼레이션들의 세트를 노출할 수 있게 합니다. Web Service 스택을 이용하여 브라우저 기반(Browser-based)의 클라이언트에 말을 거는 것은 이전에는 불가능 했기 때문에 우리는 이 기능을 Beta 2에 탑재하는 것에 매우 흥분했다.
Duplex 지원은 두 어셈블리에 있다 :하나는 WCF 서비스에, 다른하나는 Silverlight 클라이언트에 들어있다. 일단 Beta 2 SDK를 깔면, 다음 어셈블리를 얻을 수 있다.
여러분은 아마 typed "receiver" 경험과 deserialization에 대해 말한 Eugene의 포스트를 기억할 것이다. 우리는 이것을 가지고 일하고 있고, 몇 주 내에 silverlight.net에 샘플코드를 공개할 수 있을 것 같다.
Tag : Duplex, PollingDuplexBindingElement, PollingDuplexHttpBinding, Push, Silverlight, WebServiceTeam, 실버라이트, 웹서비스팀
Tag : AppManifest.xml, Beta2, ExternalCallersFromCrossDomain, MouseWheelHelper오동작, Silverlight, WebClient먹통, 실버라이트, 퍼가기
CPR for DeepZoom Data of Silverlight 2 Beta1 era.
서론
Beta2가 릴리즈 되고나니 보이시던 DeepZoom Data가 보이시지 않으십니까?
새 DeepZoom Composer로 다시 Export를 하려고 했는데 원본이미지가 없으십니까?
걱정하지 마십시오! 다음과 같은 방법으로 예전 딥줌이미지를 재활용 하실 수 있습니다. :)
이 포스트는 원본이 없어져서 새로운 DeepZoom Composer로 다시 Export 하실 수 없는 분이나,
이미 대량의 이미지를 생성해 놓은 상태여서 재활용하고 싶으신 분에게 유익합니다.
주의. Composition 방식으로 Export된 데이터에 대한 변환 팁입니다.
(Collection에 대한 변환 팁이 아닙니다.)
데이터 변환
Step3는 변환이라기 보다 dzc_output.xml 파일 내용이 초간단 하므로,
다음의 기본형에 붉은색 글자 부분을 info.xml 파일의 내용을 참고하여 수정해서 쓰는 것을
권해드립니다.
Overlap 같은 경우는 값을 정하기가 상당히 애매합니다.
dzc_output.xml 파일
변환해야하는 데이터가 많을 때는 이 과정을 자동화하시면 되겠죠?
어떤 영웅이 나와서 Converter를 곧 제공하지 않을까 생각합니다.
코드 수정
마지막으로, 만약 MultiScaleImage의 Source를 XAML이 아닌,
비하인드 코드에서 동적으로 할당해 주고 계시다면... (현실적으로 그렇게 많이 하고 계시죠)
Breaking Change에 언급된 다음과 같은 코드 수정이 필요합니다.
Beta 1
[C#]
msi.Source = new System.Uri("images/info.bin");
Beta 2
[C#]
msi.Source
= new DeepZoomImageTileSource(new System.Uri("images/dzc_output.xml"));
(단, 여기서 msi는 MultiScaleImage의 인스턴스입니다.)
xml 파일과 폴더명에 대해서
공도씨가 궁금해 하셔서 확인해 본 결과
위에서 언급한 dzc_output.xml과 dzc_output_files란 이름은 얼마든지 다른 이름을 사용할
수 있습니다.
즉 xml 파일의 이름을 hugeflow.xml이라고 하면,
MultiscaleImage는 자동으로 hugeflow_files란 폴더에서 이미지를 찾습니다.
자, 이것으로 끝.
Tag : beta1, Beta2, DeepZoom, Silverlight, 데이터재활용, 실버라이트
Tag : HTML태그제거, in C#, StripTags
Unix Timestamp를 .NET DateTime으로 변환할 때
.NET DateTime을 Unix Timestamp로 변환할 때
참고 : http://codeclimber.net.nz/archive/2007/07/10/Convert-a-Unix-timestamp-to-a-.NET-DateTime.aspx
Tag : .net, C#, datetime, unix timestamp
실버라이트에서도 WebClient 이용해서 쉽게 OpenAPI의 XML 데이터 따위를 읽어올 수 있습니다. (실버라이트에서는 비동기만 지원)
그런데 가끔 UTF-8 등으로 인코딩된 XML 파일을 읽을 때 Result의 Unicode 문자들이 깨져 있는 것을 경험하실 겁니다.
이때의 해결방법은 간단합니다.
WebClient에는 Encoding이란 프로퍼티가 있기 때문입니다.
또는 클래식한 표현으로는 아래와 같이...
해주시면 준비완료!
Tag : encoding, Silverlight, UTF-8, WebClient, 글자깨짐, 실버라이트
Tag : LOGICRAFTS, Silverlight, token_id, 버추얼어스, 실버라이트
Tag : Silverlight, 실버라이트, 주기함수
Tag : intro, Silverlight, splash screen, 실버라이트, 인트로
Deep Zoom 이미지를 위한 Thumbnail은 따로 만들 필요가 없는 것 같아요.
Deep Zoom Composer가 만들어준 파일 중에 이미 쓸 만한 것들이 많이 있으니까요!
알고 계신바와 같이 Deep Zoom Composer는 원본 이미지를 단계적으로 축소해가면서,
단위 이미지들로 쪼개어 위와 같은 구조로 만들어 줍니다.
0~8까지의 이미지 폴더 안에는 쪼개지지 않은 축소 이미지(0_0.jpg)들이 있습니다.
이중 폴더 8 안의 이미지가 쪼개지지 않은 축소 이미지 중 최대 크기 입니다.
그리고 파일 경로는 다음과 같습니다.
(사실 폴더 9 안의 이미지도 1개로 존재할 때가 있기는 하지만,
이미지에 따라서는 아래 이미지와 같이 쪼개져서 존재하는 경우가 있어
Thumbnail로 활용하기에 안전하지 않습니다.)
폴더0~8 안의 이미지들을 살펴 보면 대략 아래와 같습니다.
| 폴더 | 이미지 | 사이즈 |
| 0 | 1x1 | |
| 1 | 2x2 | |
| 2 | 4x3 | |
| 3 | 7x5 | |
| 4 | 14x9 | |
| 5 | 27x18 | |
| 6 | 54x36 | |
| 7 | 108x72 | |
| 8 | 216x144 |
각각의 폴더 안에 보시는 바와 같이 축소 이미지들이 존재를 하며,
그림 마다 정확한 사이즈가 보장되지는 않는 이유로,
크리티컬한 사이즈가 요구되는 경우를 제외하고는 유용하게 사용할 수 있습니다.
특히 실버라이트는 이미지 Resize 능력이 Browser에 의한 Resize보다 좋은 편이라
문제없이 사용할 수 있다고 생각합니다.
Deep Zoom Viewer Lite 1.3에서는 미니맵(Minimap)을 구현하기 위해 폴더 8의 이미지를
적극 활용하고 있으며, 앞으로 XML로 이미지 리스트를 Import할 수 있도록 지원할 예정인데,
이 때에도 적극 활용할 계획입니다.
Tag : Deep Zoom Composer, DeepZoom, Silverlight, 딥줌, 실버라이트, 썸네일