2012-08-01 8 views
1

큰 문제가 있습니다. 나는 C#으로 작은 서버를 작성한다. 내 고객은 자바 스크립트입니다. 자바 스크립트는 동일한 출발지 정책을 통과해야하므로 HTTP GET을 사용하여 통신합니다. 그것은 내가 comunication에 HTTP GET을 사용해야한다는 것을 의미합니다. 이제 C#이 내 URL을 잘랐다는 것을 알았습니다. C# URL의 최대 길이

나는 발송에 실패 :

http://172.16.210.25:8000/?callback=ProxyApi.saveStat&cid=1343823765156_495&cidget=null&s[901]=1044!:!5878849%3B6658291%3B2964823%3B1178767%3B469747%3B481939%3B6431323%3B1032649%3B2750603%3B208057%3B9192763%3B6669071%3B2014351%3B6816157%3B3784367%3B1242929%3B4488073%3B7662331%3B2991731%3B6404357%3B8248091%3B1795603%3B4880191%3B3080303%3B4093847%3B4618063%3B7501937%3B2842849%3B6953249%3B7102679%3B5667853%3B9851873%3B5517823%3B6114539%3B6061597%3B7647599%3B4871873%3B400087%3B7514713%3B3958217%3B8163713%3B9560437%3B8229701%3B3408749%3B4432097%3B3353219%3B2936693%3B1343597%3B3490451%3B1266191%3B9125747%3B6152921%3B2689537%3B3796861%3B4987009%3B1206841%3B9278119%3B9499619%3B455627%3B6217051%3B7603201%3B8019079%3B5306033%3B8314939%3B2997221%3B3996221%3B3889649%3B1148507%3B9397139%3B4984949%3B6576473%3B3993247%3B676051%3B5%3B&s[902]=929!:!9012569%3B9836633%3B5239051%3B6102559%3B5944079%3B9749681%3B4007797%3B344821%3B9914917%3B1950227%3B982847%3B6610337%3B6734281%3B4213463%3B1620449%3B1745111%3B8005717%3B6740443%3B8290811%3B9652289%3B279557%3B9077213%3B169933%3B4785463%3B368521%3B5881487%3B5735711%3B189377%3B3417091%3B8616299%3B7168723%3B4220969%3B4493651%3B5067977%3B1646387%3B3925297%3B5990723%3B6826471%3B3040753%3B1449733%3B8905681%3B2502001%3B7304107%3B1022677%3B4966529%3B8679397%3B4319519%3B3991279%3B1128641%3B2148631%3B2215987%3B1135217%3B3846281%3B1049843%3B309937%3B2241691%3B8768581%3B6199693%3B7973921%3B9683627%3B9664957%3B4493023%3B2494729%3B3581167%3B8474597%3B1987919%3B6099271%3B&t=68999&pxid=142221422 

하지만 문자열을 가지고 :

?callback=ProxyApi.saveStat&cid=1343823765156_495&cidget=null&s[901]=1044!:!5878849%3B6658291%3B2964823%3B1178767%3B469747%3B481939%3B6431323%3B1032649%3B2750603%3B208057%3B9192763%3B6669071%3B2014351%3B6816157%3B3784367%3B1242929%3B4488073%3B7662331%3B2991731%3B6404357%3B8248091%3B1795603%3B4880191%3B3080303%3B4093847%3B4618063%3B7501937%3B2842849%3B6953249%3B7102679%3B5667853%3B9851873%3B5517823%3B6114539%3B6061597%3B7647599%3B4871873%3B400087%3B7514713%3B3958217%3B8163713%3B9560437%3B8229701%3B3408749%3B4432097%3B3353219%3B2936693%3B1343597%3B3490451%3B1266191%3B9125747%3B6152921%3B2689537%3B3796861%3B4987009%3B1206841%3B9278119%3B9499619%3B455627%3B6217051%3B7603201%3B8019079%3B5306033%3B8314939%3B2997221%3B3996221%3B3889649%3B1148507%3B9397139%3B4984949%3B6576473%3B3993247%3B676051%3B5%3B&s[902]=929!:!9012569%3B9836633%3B5239051%3B6102559%3B5944079%3B9749681%3B4007797%3B344821%3B9914917%3B1950227%3B982847%3B6610337%3B6734281%3B4213463%3B1620449%3B1745111%3B8005717%3B6740443%3B8290811%3B9652289%3B279 

내가 몇 가지 중요한 데이터를 잃어 버렸다.

임 목록 사용 :

IPAddress local_ip = Dns.GetHostAddresses(Dns.GetHostName())[0]; 
TcpListener sockServer = new TcpListener(local_ip,Port); 

sockServer.Start(); 

그리고

ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFunction), sockServer.AcceptSocket()); 

그리고이 쓰레드 내에서 내가

static void ThreadFunction(Object param) 
    { 
     Socket socket = (Socket)param; 
     proxy.Run(socket); 
    } 

마지막으로 나는이 사용하는 메시지를 읽을 수 있습니다

int bytes = ReadMessage(socket, readBuf, ref strFromClient); 

당신이 날은 URL의 아이폰에 또는 listining의 변경 방법으로 문제를 합격 도움이 할 수 =================

(알에 javscript 클라이언트는 HTTP GET.을 사용하여 큰 messeage를 보내) == EDIT

IE, Chrome 및 FF를 사용해 봅니다. 나는

http://172.16.210.25:8000/?callback=ProxyApi.saveStat&cid=1343823765156_495&cidget=null&s[901]=1044!:!5878849%3B6658291%3B2964823%3B1178767%3B469747%3B481939%3B6431323%3B1032649%3B2750603%3B208057%3B9192763%3B6669071%3B2014351%3B6816157%3B3784367%3B1242929%3B4488073%3B7662331%3B2991731%3B6404357%3B8248091%3B1795603%3B4880191%3B3080303%3B4093847%3B4618063%3B7501937%3B2842849%3B6953249%3B7102679%3B5667853%3B9851873%3B5517823%3B6114539%3B6061597%3B7647599%3B4871873%3B400087%3B7514713%3B3958217%3B8163713%3B9560437%3B8229701%3B3408749%3B4432097%3B3353219%3B2936693%3B1343597%3B3490451%3B1266191%3B9125747%3B6152921%3B2689537%3B3796861%3B4987009%3B1206841%3B9278119%3B9499619%3B455627%3B6217051%3B7603201%3B8019079%3B5306033%3B8314939%3B2997221%3B3996221%3B3889649%3B1148507%3B9397139%3B4984949%3B6576473%3B3993247%3B676051%3B5%3B&s[902]=929!:!9012569%3B9836633%3B5239051%3B6102559%3B5944079%3B9749681%3B4007797%3B344821%3B9914917%3B1950227%3B982847%3B6610337%3B6734281%3B4213463%3B1620449%3B1745111%3B8005717%3B6740443%3B8290811%3B9652289%3B279557%3B9077213%3B169933%3B4785463%3B368521%3B5881487%3B5735711%3B189377%3B3417091%3B8616299%3B7168723%3B4220969%3B4493651%3B5067977%3B1646387%3B3925297%3B5990723%3B6826471%3B3040753%3B1449733%3B8905681%3B2502001%3B7304107%3B1022677%3B4966529%3B8679397%3B4319519%3B3991279%3B1128641%3B2148631%3B2215987%3B1135217%3B3846281%3B1049843%3B309937%3B2241691%3B8768581%3B6199693%3B7973921%3B9683627%3B9664957%3B4493023%3B2494729%3B3581167%3B8474597%3B1987919%3B6099271%3B&t=68999&pxid=142221422 

를 전송하지만, 난 항상 항상

GET /?callback=ProxyApi.saveStat&cid=1343823765156_495&cidget=null&s[901]=1044!:!5878849%3B6658291%3B2964823%3B1178767%3B469747%3B481939%3B6431323%3B1032649%3B2750603%3B208057%3B9192763%3B6669071%3B2014351%3B6816157%3B3784367%3B1242929%3B4488073%3B7662331%3B2991731%3B6404357%3B8248091%3B1795603%3B4880191%3B3080303%3B4093847%3B4618063%3B7501937%3B2842849%3B6953249%3B7102679%3B5667853%3B9851873%3B5517823%3B6114539%3B6061597%3B7647599%3B4871873%3B400087%3B7514713%3B3958217%3B8163713%3B9560437%3B8229701%3B3408749%3B4432097%3B3353219%3B2936693%3B1343597%3B3490451%3B1266191%3B9125747%3B6152921%3B2689537%3B3796861%3B4987009%3B1206841%3B9278119%3B9499619%3B455627%3B6217051%3B7603201%3B8019079%3B5306033%3B8314939%3B2997221%3B3996221%3B3889649%3B1148507%3B9397139%3B4984949%3B6576473%3B3993247%3B676051%3B5%3B&s[902]=929!:!9012569%3B9836633%3B5239051%3B6102559%3B5944079%3B9749681%3B4007797%3B344821%3B9914917%3B1950227%3B982847%3B6610337%3B6734281%3B4213463%3B1620449%3B1745111%3B8005717%3B6740443%3B8290811%3B9652289%3B279 

private Byte[] readBuf = new Byte[2048]; 
int bytes = ReadMessage(socket, readBuf, ref strFromClient); 

내 바이트 얻을 경우이 한계가 될 수 1024입니까?

+0

@Shai는 브라우저에서 잘린 것으로 대답했기 때문에 C#과는 아무런 관련이 없습니다. – Oded

+0

@Shai는 그의 대답에서 언급했듯이, 나는 당신이 당신의 접근 방식을 재고 할 필요가있을 것이라고 생각합니다. 한계가 ~ 2000 자일지라도 요청이 더 커질 때 나중에이 문제를 해결할 것입니다. –

답변

0

부주의했습니다. 함수 ReadMessage는 자체 클래스의 함수입니다. 그리고 그것은 쓴 :

sock.Receive(buf,buf.Length,0); 

을 그리고 지금은 실행 : 물론

sock.Receive(buf, 1024, 0); 

내가 해결. 답변 해 주셔서 감사합니다.

4

요청은 보통 ~ 2000 자 (클라이언트 지혜, 즉) 여기

그것이라고 그 이유는, 많은 양의 데이터를 전송하기위한 목적으로하지 않는 reference MS

에서

GET의 제한됩니다 HTTP GET GET ... 귀하의 고객에 관한 더 자세한 정보를 제공하려고합니다. 귀하에게 대안을 제공 할 수 있습니다.

+1

하지만 원래 URL은 1531 자입니다. –

+0

@ YngveB.Nilsen 잘 그것은 클라이언트가 가지고있는 한계에 많이 의존합니다. 예를 들어이 길이는 인터넷 익스플로러 버전간에 차이가 날 수 있습니다. – Shai

+0

@ YngveB.Nilsen - 동일한 브라우저의 서로 다른 브라우저와 버전에 따라 최대 URL 길이에 대한 제한이 달라집니다. – Oded